(有意思的冷知识)
很多程序语言里,定义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点。
(我想以上问题如果作为面试题,也能难倒一批人吧)
打印出来的结果:
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点。
(我想以上问题如果作为面试题,也能难倒一批人吧)
转载自 http://blog.csdn.net/wanghai__/article/details/6239863
相关推荐
一、Date对象每天一对象,今天来看看Date对象,相对于时间大家一定很熟悉,应为以前在...如果是数字值,dateVal 表示指定日期与 1970 年 1 月 1 日午夜间全球标准时间的毫秒数。如果是字符串,则 dateVal 按照 parse
(2)new Date(milliseconds) // 返回从 1970 年 1 月 1 日至今的毫秒数 (3)new Date(dateString) (4)new Date(year, month, day, hours, minutes, seconds, milliseconds) 提示:每个Date对象都只是计算机...
时间戳就是从1970年1月1日0时0分0秒到当前时间点的所有秒数。1970.1.1 0:0:0 这个时间就是IT中所谓的“时间纪元”,相信大家在很多文章中都见过它。比如oracle的时间显示,unix和linux系统的时间运算等,那为什么...
为此,Date类型使用自UTC 1970年1月1日零时开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的285 616年。 创建日期对象 在javascript中,可以...
Date对象:基于1970年1月1日(世界标准时间)起的毫秒数 本文参考MDN做的详细整理,方便大家参考MDN 构造函数: 1.new Date(); 依据系统设置的当前时间来创建一个Date对象。 2.new Date(value); value代表自1970年1月1...
Date对象有多种构造函数: new Date() //当前时间 new Date(milliseconds) //距离起始时间1970年1月1日的毫秒数 new Date(datestring) //字符串代表的日期与时间。此字符串可以使用Date.parse()转换,比如”Jannuary...
为此Date类型使用自UTC(国际协调时间)1970年1月1日午夜(0时)开始经过的毫秒数来保存日期。 创建日期对象 1.创建当前日期。不需要传入参数 2.创建指定日期。需要传入参数,必须传入表示该日期的毫秒数(即从1970年1...
(2)创建一个代表1970年1月1日 00:00:00加上输入参数的毫秒数的Date对象 long second=1000; Date d = new Date(second); (3)创建一个我们指定的时间的Date对象: 使用带参数的构造方法Date(int year, int month,...
而这个参数,必须是毫秒数(UTC时间1970年1月1日午夜起至自定义时间为止的毫秒数)。 我们可以使用Date.parse()和Date.UTC()来获得自定义时间的毫秒数。 Date.parse()接收一个表示日期的字符串参数,例如”May 25,...
JS Date 对象用于处理日期和时间。 创建 Date 对象的语法: var myDate=new Date() Date 对象... 注意最后一种形式,参数表示的是需要创建的时间和GMT时间1970年1月1日之间相差的毫秒数。各种函数的含义如下: month:用
Date对象基于1970年1月1日(世界标准时间)起的毫秒数。 JavaScript 的Date对象提供了数个UTC时间的方法,也相应提供了当地时间的方法。UTC,也就是我们所说的格林威治时间,指的是time中的世界时间标准。而当地时间...
//value-毫秒:代表自世界协调时1970年1月1日00:00:00开始的数值。 new Date(value); //dateString-日期字符串:表示日期的字符串值。此字符串应该是在parse方法中识别的格式。 new Date(dateString); //year-年:...
设置日期和时间值 设置日期和时间值有两种方法: 1、只声明距离1970年1月1日凌晨12点的毫秒数 a、直接用距离1970年1月1日凌晨12点的毫秒数 var d=new Date(0); b、parse方法: parse方法接受字符串为参数,把该...
new Date() //当前时间new Date(milliseconds) //距离起始时间1970年1月1日的毫秒数new Date(datestring) //字符串代表的日期与时间。此字符串可以使用Date.parse()转换,比如”Jannuary 1, 1998 20:13:15″new Date...
接收一个参数x: 返回1970年1月1日 + x毫秒的值。 new Date(1, 1, 1)返回1901年2月1号。 new Date(2016, 1, 1)不会在1900年的基础上加2016,而只是表示2016年2月1号。 2. 使用new Date(time) 将时间转换成 Date 对象...
Q 老师,时间毫秒值从1970年1月1日0:00.000开始计算,上面示例中10年后应该是1980年1月1日0:00.000,为什么输出结果是:1980年1月1日 8:00呢? A java.util.Date类型表示的是GMT时间,本身输出是国际化输出,...
知识点: 主要是对Date对象的使用。(下面的介绍内容来自网络) 创建 Date 对象的语法: var myDate=... 注意:最后一种形式,参数表示的是需要创建的时间和GMT时间1970年1月1日之间相差的毫秒数。 参数的含义如下: mo
Date类型使用自UTC1970年1月1日午夜(零时)开始经过的毫秒数来保存日期。 创建日期对象的方法: (1)获得当前日期和时间 var date = new Date(); (2)根据特定的日期和时间创建日期对象 传入的参数:从UTC午夜开始...
new Date(milliseconds) //返回从 1970 年 1 月 1 日至今的毫秒数 new Date(dateString) new Date(year, month, day, hours, minutes, seconds, milliseconds) 上面的参数大多数都是可选的,在不指定的情况下,默认...
遇到一个场景,需要拿到指定时间范围内的每一天,满足格式”YYYYMMDD”,简单的功能,简单的思路 准备 date对象有很多的方法,... getTime() 返回1970年1月1日到date对象的毫秒数 解析指定范围 规定按照 yyyy-mm-d