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 “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点。

我想以上问题如果作为面试题,也能难倒一批人了.

java为啥计算时间从1970年1月1日开始的更多相关文章

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

    格林威治时间即UTC/GMT时间,1970年01月01日00时00分00秒(即UTC+8的北京时间1970年01月01日08时00分00秒)计算代码如下: /** * 获取指定时间到格林威治时间的秒数 ...

  2. 格林治时间,也就是返回从 UTC 1970 年 1 月 1 日午夜开始经过的毫秒数。

    格林治时间,也就是返回从 UTC 1970 年 1 月 1 日午夜开始经过的毫秒数. (* Delphi获取13位格林治时间实现方法, 与java中的java.lang.System.currentT ...

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

    1970年1月1日(00:00:00 GMT)Unix 时间戳(Unix Timestamp)对时间转换 将Long类型转换为DateTime类型 /// <summary> /// 将L ...

  4. DedeCMS文章编辑不更新时间1970年1月1日

    在修改文章或者后期优化的时候,织梦dedecms5.7版本存在一个问题,修改文章的同时也修改了文章的发布时间,这个功能可能有些人比较需要,但同时也有些站长朋友又不需要,因为我们编辑某个文章的时候,发现 ...

  5. 1970年1月1日(00:00:00 GMT)Unix 时间戳(Unix Timestamp)

    转载自(http://jm.ncxyol.com/post-88.html) 今天在看Python   API时,看到time模块: The epoch is the point where the ...

  6. 数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?

    https://zhuanlan.zhihu.com/p/109964336 ​今年是闰年,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的? 这是个好问题,正好梳理一下,Power ...

  7. Java、JSP获得当前日期的年、月、日

    Java package com.ob; import java.text.ParseException; import java.text.SimpleDateFormat; import java ...

  8. 为何 UNIX 时间 0, 有时显示是1970年1月1日,有时显示是1969年12月31日

    by Rachael Arnold http://www.rachaelarnold.com/dev/archive/why-is-date-returning-wrong Demystifying ...

  9. java获取两个时间的相隔时间,包括年、月、日、时、分、秒

    public static final int YEAR_RETURN = 0;                    public static final int MONTH_RETURN = 1 ...

随机推荐

  1. KRBTabControl

    This article explains how to make a custom Windows Tab Control in C#. Download demo project - 82.4 K ...

  2. [TypeScript] Work with DOM Elements in TypeScript using Type Assertions

    The DOM can be a bit tricky when it comes to typing. You never really know exactly what you're going ...

  3. OpenCV和Matlab

    OpenCV(Open Computer Vision)是现在流行的做计算机视觉和图像处理的工具库.Matlab一般用于快速实现算法和测试,用于研究理论,OpenCV适合开发实际的图像处理或视觉的应用 ...

  4. Kubernetes1.6新特性:全面支持多颗GPU

    (一)  背景资料 GPU就是图形处理器,是Graphics Processing Unit的缩写.电脑显示器上显示的图像,在显示在显示器上之前.要经过一些列处理,这个过程有个专有的名词叫" ...

  5. angular 禁止事件冒泡 和 默认行为

    事件冒泡和事件捕捉一直以来都是被讨论的话题,也许大家平时在工作中没有遇到过需要解决事件冒泡的情况举个例子: <body ng-click="fun1()"> <d ...

  6. mac 查看目前哪些进程占用哪些端口

    lsof -nP  | grep TCP | grep LISTEN lsof -i :TCP

  7. The promises and challenges of std::async task-based parallelism in C++11 C++11 std::async/future/promise

    转载 http://eli.thegreenplace.net/2016/the-promises-and-challenges-of-stdasync-task-based-parallelism- ...

  8. django inspectdb

    使用inspectdb  --通过已有数据库表生成 model.pyinspectdb辅助工具检查你的settings文件指向的数据库,决定你表示你的表的Django模型并打印Python模型代码到标 ...

  9. ASP.NET 推荐书籍

    ASP.NET 推荐书籍 1.首先推荐一本ASP.NET MVC的书籍 —— <Web开发新体验:ASP.NET 3.5 MVC架构与实战> [点评]:ASP.NET的MVC的书籍本来就不 ...

  10. Mongodb的CRUD

    1.查询 使用db.collection.find()方法进行查询.db.collection.findOne()返回单个文档.mongodb的所有查询操作都是针对单个collection > ...