`
zl378837964
  • 浏览: 186916 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

new Date() 系统时间从1970年1月1日开始计算

阅读更多

(有意思的冷知识)

很多程序语言里,定义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点。
(我想以上问题如果作为面试题,也能难倒一批人吧)
转载自 http://blog.csdn.net/wanghai__/article/details/6239863
 
分享到:
评论

相关推荐

    JS之Date对象和获取系统当前时间详解

    一、Date对象每天一对象,今天来看看Date对象,相对于时间大家一定很熟悉,应为以前在...如果是数字值,dateVal 表示指定日期与 1970 年 1 月 1 日午夜间全球标准时间的毫秒数。如果是字符串,则 dateVal 按照 parse

    JavaScript程序设计课件:Date对象.pptx

    (2)new Date(milliseconds) // 返回从 1970 年 1 月 1 日至今的毫秒数 (3)new Date(dateString) (4)new Date(year, month, day, hours, minutes, seconds, milliseconds) 提示:每个Date对象都只是计算机...

    Javascript new Date().valueOf()的作用与时间戳由来详解

    时间戳就是从1970年1月1日0时0分0秒到当前时间点的所有秒数。1970.1.1 0:0:0 这个时间就是IT中所谓的“时间纪元”,相信大家在很多文章中都见过它。比如oracle的时间显示,unix和linux系统的时间运算等,那为什么...

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

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

    原生JS:Date对象全面解析

    Date对象:基于1970年1月1日(世界标准时间)起的毫秒数 本文参考MDN做的详细整理,方便大家参考MDN 构造函数: 1.new Date(); 依据系统设置的当前时间来创建一个Date对象。 2.new Date(value); value代表自1970年1月1...

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

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

    Javascript中Date类型和Math类型详解

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

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

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

    JS中Date日期函数中的参数使用介绍

    而这个参数,必须是毫秒数(UTC时间1970年1月1日午夜起至自定义时间为止的毫秒数)。 我们可以使用Date.parse()和Date.UTC()来获得自定义时间的毫秒数。 Date.parse()接收一个表示日期的字符串参数,例如”May 25,...

    JS Date函数整理方便使用

    JS Date 对象用于处理日期和时间。 创建 Date 对象的语法: var myDate=new Date() Date 对象... 注意最后一种形式,参数表示的是需要创建的时间和GMT时间1970年1月1日之间相差的毫秒数。各种函数的含义如下: month:用

    JavaScript Date对象功能与用法学习记录

    Date对象基于1970年1月1日(世界标准时间)起的毫秒数。 JavaScript 的Date对象提供了数个UTC时间的方法,也相应提供了当地时间的方法。UTC,也就是我们所说的格林威治时间,指的是time中的世界时间标准。而当地时间...

    JavaScript原生对象之Date对象的属性和方法详解

    //value-毫秒:代表自世界协调时1970年1月1日00:00:00开始的数值。 new Date(value); //dateString-日期字符串:表示日期的字符串值。此字符串应该是在parse方法中识别的格式。 new Date(dateString); //year-年:...

    JavaScript高级程序设计 读书笔记之十 本地对象Date日期

    设置日期和时间值 设置日期和时间值有两种方法: 1、只声明距离1970年1月1日凌晨12点的毫秒数 a、直接用距离1970年1月1日凌晨12点的毫秒数 var d=new Date(0); b、parse方法: parse方法接受字符串为参数,把该...

    javascript时间函数基础介绍

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

    javascript 玩转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 对象...

    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时间,本身输出是国际化输出,...

    javascript-简单的日历实现及Date对象语法介绍(附图)

    知识点: 主要是对Date对象的使用。(下面的介绍内容来自网络) 创建 Date 对象的语法: var myDate=... 注意:最后一种形式,参数表示的是需要创建的时间和GMT时间1970年1月1日之间相差的毫秒数。 参数的含义如下: mo

    JavaScript引用类型Date常见用法实例分析

    Date类型使用自UTC1970年1月1日午夜(零时)开始经过的毫秒数来保存日期。 创建日期对象的方法: (1)获得当前日期和时间 var date = new Date(); (2)根据特定的日期和时间创建日期对象 传入的参数:从UTC午夜开始...

    JavaScript中日期的相关操作方法总结

    new Date(milliseconds) //返回从 1970 年 1 月 1 日至今的毫秒数 new Date(dateString) new Date(year, month, day, hours, minutes, seconds, milliseconds) 上面的参数大多数都是可选的,在不指定的情况下,默认...

    JavaScript生成指定范围的时间列表

    遇到一个场景,需要拿到指定时间范围内的每一天,满足格式”YYYYMMDD”,简单的功能,简单的思路 准备  date对象有很多的方法,... getTime() 返回1970年1月1日到date对象的毫秒数 解析指定范围  规定按照 yyyy-mm-d

Global site tag (gtag.js) - Google Analytics