为什么编程语言以及数据库要从1970年1月1日开始计算时

今天在看Python  API时,看到time模块:

The epoch is the point where the time starts. On January 1st of that year, at 0 hours,the “time since the epoch” is zero. For Unix, the epoch is 1970. To find out what the epoch is, look at gmtime(0).

定义time从1970年1月1日开始,忽然想到在JAVA里,Oracle数据库时间也是从1970
年1月1日开始计算。比如java类代码

Date date = new Date(0);
System.out.println(date);

打印出来的结果:

Thu Jan 01 08:00:00 CST 1970

也是1970年1月1日,实际上时分秒是0点0分0秒(这里打印出来是8点,稍后会作解释)。

为什么这个时间会定义在1970年1月1日这个时候呢?

于是开始了Google,中文网页根本找不到答案。于是试着搜索英文关键字,在Sun java论坛总算找到准确的帖子:

http://forums.sun.com/thread.jspa?threadID=595140&start=15

其中有一个回复:

I suspect that Java was born and raised on a UNIX system.
UNIX considers the epoch (when did time begin) to be midnight, January 1, 1970.

是说java起源于UNIX系统,而UNIX认为1970年1月1日0点是时间纪元.

但这依然没很好的解释"为什么",出于好奇,继续Google,总算找到了答案:

http://en.wikipedia.org/wiki/Unix_time

这里的解释是:

最初计算机操作系统是32位,而时间也是用32位表示。

System.out.println(Integer.MAX_VALUE);
2147483647

Integer在JAVA内用32位表示,因此32位能表示的最大值是2147483647。另外1年365天的总秒数是31536000,

2147483647/31536000 = 68.1

也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07
秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为
10000000 00000000 00000000 00000000

也就是1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了。

到这里,我想问题的答案已经出来了:

因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算
机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始
时间),而java自然也遵循了这一约束。

至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作
系统可以表示到292,277,026,596年12月4日15时30分08秒,

时间: 2024-12-07 02:36:53

为什么编程语言以及数据库要从1970年1月1日开始计算时的相关文章

java为啥计算时间从1970年1月1日开始

http://www.myexception.cn/program/1494616.html ---------------------------------------------------------- java为什么计算时间从1970年1月1日开始 今天在看Python  API 时,看到 time 模块 : The epoch is the point where the time starts. On January 1st of that year, at 0 hours,the

日期类的时间从为什么是从1970年1月1日(格林威治时间)

I suspect that Java was born and raised on a UNIX system.UNIX considers the epoch (when did time begin) to be midnight, January 1, 1970.是说java起源于UNIX系统,而UNIX认为1970年1月1日0点是时间纪元. 但这依然没很好的解释"为什么",出于好奇,继续Google,总算找到了答案: http://en.wikipedia.org/wiki/

为什么编程时间从1970年1月1日開始?

查看原文:http://www.ibloger.net/article/136.html 最初计算机操作系统是32位,而时间也是用32位表示. System.out.println(Integer.MAX_VALUE); 2147483647 Integer在JAVA内用32位表示,因此32位能表示的最大值是2147483647. 另外1年365天的总秒数是31536000, 2147483647/31536000 = 68.1 也就是说32位能表示的最长时间是68年.而实际上到2038年01月

判断距离1970年1月1日的天数

#include <stdlib.h> /****************************************************************** 功能: 输入年月日,计算距离1970年1月1日的天数 输入: 年月日,输入年份范围[1970,2100],输入年月日的有效性需要判断 输出: DaysSince1970:距离1970年1月1日的天数 已知 1970年1月1日为星期四 异常时,输出不需要关注 返回: 1 上班 0 休假 -1 表示异常 根据国家规定:周一到

Java 获取各时区时间,获取当前时间到格林威治时间1970年01月01日00时00分00秒的秒数

格林威治时间即UTC/GMT时间,1970年01月01日00时00分00秒(即UTC+8的北京时间1970年01月01日08时00分00秒)计算代码如下: 1 /** 2 * 获取指定时间到格林威治时间的秒数 3 * UTC:格林威治时间1970年01月01日00时00分00秒(UTC+8北京时间1970年01月01日08时00分00秒) 4 * @param time 5 * @return 6 */ 7 public static long diffSeconds(String time){

为什么编程时间从1970年1月1日开始?

最初计算机操作系统是32位,而时间也是用32位表示. System.out.println(Integer.MAX_VALUE); 2147483647 Integer在JAVA内用32位表示,因此32位能表示的最大值是2147483647.另外1年365天的总秒数是31536000, 2147483647/31536000 = 68.1 也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为

数据库练习(16年12月16日)--牛客网

1. 用命令(A B D)可以查看mysql数据库中user表的表结构? A desc user        B   show create table user    C show columns for user   D  describe user 解析: 查看Mysql表结构的命令,如下: desc 表名; show columns from 表名; describe 表名; show create table 表名; use information_schema select * f

数据库练习(16年12月27日)-- 牛客网

数据完整性可以分为四类. 1.实体完整性,实体完整性的目的是确保数据库中所有实体的唯一性,也就是不应出现完全相同的数据记录. 2.区域完整性,匹配完整性要求数据表中的数据位于某一个特定的允许范围内. 3.参考完整性,是用来维护相关数据表之间数据一致性的手段,通过实现参考完整性,可以避免因一个数据表的记录改变而造成另一个数据表内的数据变成无效值. 4.用户自定义完整性,用户自定义由用户根据实际应用中的需要自行定义. 题目: 关于数据完整性,以下说法正确的是?   AD A 引用完整性通过主键和外键

从1970年1月1日00:00:00 GMT以来此时间对象表示的毫秒数转化为Datetime

将Long类型转换为DateTime类型 /// <summary> /// 将Long类型转换为DateTime类型 /// </summary> /// <param name="d">long</param> /// <returns></returns> public static DateTime ConvertLongDateTime(long ticks) { DateTime dtBase = ne