`

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 “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 秒,相信我们的 N 代子孙,哪
怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了。

最后一个问题:上面System.out.println(new Date(0)),打印出来的时间是8点而非0点,
原因是存在系统时间和本地时间的问题,其实系统时间依然是0点,只不过我的电脑时区
设置为东8区,故打印的结果是8点。

我想以上问题如果作为面试题,也能难倒一批人了.
分享到:
评论

相关推荐

    设计一个名为MyDate.zip

    设计以一个名为MyDate的类。该类包括: *表示日期的数据域year,month,和day ...*一个构造方法,以指定的流逝时间值创建MyDate对象,该流逝时间从1970年1月1日午夜开始计算并以毫秒数为单位。 ......

    设置时间对象、计算两个时间差值

    设置时间对象、计算两个时间差值。设置1970年1月1日午夜与当前日期和时间之间的毫秒数(4种方法)、计算北京奥运会到当前相隔多少天多少小时多少分钟秒钟。

    java常用工具类的使用

    Q 老师,时间毫秒值从1970年1月1日0:00.000开始计算,上面示例中10年后应该是1980年1月1日0:00.000,为什么输出结果是:1980年1月1日 8:00呢? A java.util.Date类型表示的是GMT时间,本身输出是国际化输出,...

    java万年历,获取该年月日历表

     注:计算机中的时间最小到1900年,此外UNIX系统认为1970年1月1日0点是时间纪元。  so,在本程序中不考了1900年以前的年份了。有兴趣的可以自己研究下。 import java.util.Scanner; class Calender{ public ...

    JAVA的时间类使用(通过编写一个日历学习)

    (2)创建一个代表1970年1月1日 00:00:00加上输入参数的毫秒数的Date对象 long second=1000; Date d = new Date(second); (3)创建一个我们指定的时间的Date对象: 使用带参数的构造方法Date(int year, int month,...

    秒转换日期时间工具

    将1970年1月1日到目前的秒转换成日期时间

    java大作业.zip

    2.可以通过下拉菜单选择年(1970~2099)和月来查看当月日历 3.可以点击“今天”按钮返回今日所在月日历 4.点击修改时间选择年月日时分秒可以修改时间 5.时区默认选择北京时间 6.修改过的时间可以通过“根据本地系统...

    阳历转阴历_java

    "yyyy年MM月dd日"); final static long[] lunarInfo = new long[] { 0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, ...

    浅谈JavaScript 中有关时间对象的方法

    为此 Date 类型使用自 UTC (Coordinated Universal Time, 国际协调时间)1970年1月1日午夜开始经过的毫秒数来保存日期。 在这种数据存储格式下, Date 类型保存的日期能够精确到1970年1月1日之前或之后的285616年 •...

    浅析Java中Data类的应用

    就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数。 创建一个日期对象 让我们看一个...

    Javascript中Date类型和Math类型详解

    为此Date类型使用自UTC(国际协调时间)1970年1月1日午夜(0时)开始经过的毫秒数来保存日期。 创建日期对象 1.创建当前日期。不需要传入参数 2.创建指定日期。需要传入参数,必须传入表示该日期的毫秒数(即从1970年1...

    JavaScript 脚本将当地时间转换成其它时区

    但是,如果你想显示不同地区的时间—–例如,如果你的本部在别的国家,你想查看“本国”时间而非... 通过调用Data()对象的getTime()方法,即可显示1970年1月1日后到此当时时间之间的毫秒数。 // convert to msec since

    javascript引用类型之时间Date和数组Array

    为此,Date类型使用自UTC 1970年1月1日零时开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的285 616年。 创建日期对象 在javascript中,可以...

    javascript类型系统——日期Date对象全面了解

    Date对象是在早期java中的java.util.Date类基础上创建的,为此,Date类型使用自UTC1970年1月1日0点开始经过的毫秒数来保存日期,它可以表示的时间范围是1970年1月1日0点前后的各1亿天。本文将详细介绍Date对象的用法...

    javascript时间函数基础介绍

    new Date() //当前时间new Date(milliseconds) //距离起始时间1970年1月1日的毫秒数new Date(datestring) //字符串代表的日期与时间。此字符串可以使用Date.parse()转换,比如”Jannuary 1, 1998 20:13:15″new Date...

    javascript 时间显示代码集合(Date对象)

    Date对象有多种构造函数: new Date() //当前时间 new Date(milliseconds) //距离起始时间1970年1月1日的毫秒数 new Date(datestring) //字符串代表的日期与时间。此字符串可以使用Date.parse()转换,比如”Jannuary...

    C# 最全的日期正则表达式,没有之一

    公历的平年只有365日,比回归年短约0.2422 日,每四年累积约一天,把这一天加于2月末(即2月29日),使当年时间长度变为366日,这一年就为闰年。 需要注意的是,现在的公历是根据罗马人的“儒略历”改编而得。由于...

    python time()的实例用法

    计算机元年是指1970年1月1日0时0分0秒。 另外在python中时间戳表示为秒数,在java中表示为毫秒数。 返回值: 浮点数,内容是计算机元年至今的秒数。 案例: print(time.time()) # 获取当前时间戳 out:

    Date、DateFormat、Calendar日期类

    基准时间是1970年1月1日8时0分0秒 如图: 注意这里重写了toString方法按照一定的格式去输出时间(toString把他变成字符串输出) (3)常用方法: 如图: 2.DateFormat (1)所在位置java.text.DateFormat (2)Date

    JSP 日期处理

    第二个构造函数接受一个参数,这个参数表示从1970年1月1日凌晨至所要表示时间的毫秒数。 Date(long millisec) 获取Date对象后,您就能够使用下表列出的所有方法: 序号 方法 & 描述 1 ...

Global site tag (gtag.js) - Google Analytics