`
zl378837964
  • 浏览: 189412 次
  • 性别: 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
 
分享到:
评论

相关推荐

    java中 new date() 打印出的时间与系统时间错了八小时的解决方法

    Java使用`java.util.Date`类来表示日期和时间,而`System.currentTimeMillis()`方法返回的是自1970年1月1日00:00:00 GMT以来的毫秒数。`new Date()` 实际上是基于这个毫秒值创建一个日期对象,但它默认使用的是UTC...

    js中获取时间new date()的用法.txt

    - 毫秒值是从1970年1月1日午夜开始到现在的毫秒数。 4. **传入年、月、日等参数**: - `var myDate = new Date(1995, 11, 17, 3, 24, 0);` - 注意月份是从0开始计算的(即0表示1月)。 #### 三、获取日期和时间...

    一个long型与Date型时间转换工具

    Long类型在Java中通常用来存储时间戳,即从1970年1月1日(UTC)开始到现在的毫秒数。Date对象则用于表示特定的瞬间,精确到毫秒。转换工具的目的是在两者之间灵活地进行转换,这对于数据分析、日志记录和测试尤其...

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

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

    原生JS:Date对象全面解析

    首先,Date对象是基于1970年1月1日(世界标准时间)开始计算的,以毫秒为单位。JavaScript中Date对象的时间范围是从1970年1月1日00:00:00 UTC往前推100,000,000天到往后推100,000,000天。 Date对象的构造函数有多种...

    date与long型转换工具

    在日期和时间上下文中,Long通常用来存储从1970年1月1日00:00:00 UTC(协调世界时)到某一时刻的毫秒数,这就是常说的时间戳。 3. **转换过程**: - **Date转Long**:要将Date对象转换为long类型,可以调用Date...

    使用oracle计算系统当前时间的毫秒数

    2. **转换为自1970年1月1日以来的天数**:接着将`SYSDATE`减去1970年1月1日(使用`TO_DATE`函数)得到的结果表示的是自1970年1月1日至当前日期的时间差(单位是天)。 3. **转换为毫秒数**:由于一天有86400秒,而...

    Date的Java源代码

    在Java中,`java.util.Date`类用来表示特定的时间点,即毫秒值距离1970年1月1日00:00:00 GMT的时间。这个类提供了一系列的方法用于处理日期和时间,如获取当前日期、设置日期、比较两个日期等。 ### 2. 创建 Date ...

    Date对象之获取和设置月份-getMonth&setMonth;(教辅).pdf

    由于JavaScript的日期和时间计算是从1970年1月1日开始的,所以不论何时创建一个Date对象,其内部表示的总是从那时开始到当前时间所经过的毫秒数。因此,当我们调用getMonth()方法时,得到的实际上是从1970年1月1日...

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

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

    JQ JS javascript new Data() 获取 指定日期 的 后一天

    - `Date.parse(dateString)`:解析一个日期/时间字符串,并返回自1970年1月1日(UTC)以来的毫秒数。你可以用这个方法先将你的指定日期转换为毫秒值。 - 或者,直接使用`new Date('yourDateString')`构造函数,...

    js date转String 日期字符串转换

    - `getTime()`:获取自1970年1月1日00:00:00 UTC起至现在的毫秒数。 ```javascript var myDate = new Date(); console.log(myDate.getTime()); ``` ##### 2.6 获取小时、分钟、秒和毫秒 - `getHours()`:获取当前...

    java中获取系统时间

    1. **获取毫秒数**:`System.currentTimeMillis()`返回自1970年1月1日0时0分0秒以来的毫秒数。 2. **创建对象**:通过将上述毫秒数传递给`Date`类的构造函数,可以创建一个新的`Date`对象。 3. **输出结果**:与方法...

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

    - `new Date(milliseconds)`:根据自1970年1月1日以来的毫秒数创建新Date对象。 - `new Date(dateString)`:根据给定的日期字符串创建Date对象,如"YYYY-MM-DD HH:MM:SS"。 - `new Date(year, month, day, hours,...

    Java日期时间Date类型,long类型,String类型表现形式的转换.pdf

    这个值是从1970年1月1日00:00:00 GMT开始计算的毫秒数。例如,创建一个Date对象,然后调用getTime()方法获取时间的long类型表示: ```java java.util.Date date = new java.util.Date(); long time = date.getTime...

    Js获取当前日期时间及格式化代码

    ` 返回从1970年1月1日00:00:00 UTC到当前时间的毫秒数。 - `myDate.getHours();` 返回当前的小时数(0-23)。 - `myDate.getMinutes();` 返回当前的分钟数(0-59)。 - `myDate.getSeconds();` 返回当前的秒数(0...

    TimeUtil_java-long型与Date型时间转换工具

    `long`类型通常用来表示自1970年1月1日00:00:00(UTC)以来的毫秒数,而`java.util.Date`类则封装了具体的日期和时间信息。两者之间的相互转换在实际开发中十分常见,例如在存储、计算或展示日期时。`TimeUtil`是一...

    domino xpages 开发Date函数使用例子

    - 1970年1月2日00:00:00 UTC的数值为86,400,000。 - 1969年12月31日00:00:00 UTC的数值为-86,400,000。 在使用Date对象时需要注意以下几点: 1. 年份不缩写,不要用07表示2007,因为07会被解析为公元7年。为了确保...

    时间戳转成时间格式

    时间戳(Timestamp)是一种记录时间的方式,它表示从一个固定的时间点(通常是1970年1月1日午夜,即所谓的“Unix纪元”开始)到当前时间所经过的秒数或毫秒数。在计算机科学中,时间戳广泛应用于日期和时间的计算、...

Global site tag (gtag.js) - Google Analytics