`

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

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

相关推荐

    iOS 根据java时间戳计算时间的demo

    而在iOS中,通常使用NSTimeInterval,它是一个双精度浮点数,代表以秒为单位的时间间隔,同样是从1970年1月1日开始计算。 要将Java时间戳转换为iOS时间戳,我们需要将Java的毫秒值除以1000,得到秒数。以下是转换...

    java编写的计算系统时间差的程序

    这里的`getTime()`方法返回的是自1970年1月1日00:00:00 UTC至指定的时间点的毫秒数,是计算时间差的关键。 #### 3. 时间单位换算 得到毫秒差后,代码进一步将其转换为更易读的形式:天、小时、分钟和秒。这涉及到...

    java的时间处理续计算java时间).pdf

    Java 中的时间处理是基于 1970 年 1 月 1 日开始的毫秒数计算的。下面是 Java 中处理时间的相关知识点: 1. Date 类:Date 类的构造函数 Date() 返回代表当前创建的时刻的对象。Date 的方法 getTime() 返回一个 ...

    专题资料(2021-2022年)java的时间处理续计算java时间.doc

    Java中的时间计算基于自1970年1月1日00:00:00 UTC(协调世界时)起的毫秒数。`java.util.Date`类是处理日期和时间的基础,它的构造函数创建一个表示当前时刻的Date对象,而`getTime()`方法返回自1970年以来的毫秒数...

    java中的时间操作

    这里的毫秒值是从1970年1月1日00:00:00 UTC至当前时间之间的毫秒数。 2. **使用`System.currentTimeMillis()`**: - 另一种获取当前时间的方法是使用`System.currentTimeMillis()`方法。 ```java long ...

    java 日期操作工具类:包括计算两个时间相差距离多少天多少小时多少分多少秒

    这可以通过`getTime()`方法实现,它返回Date对象自1970年1月1日00:00:00 GMT以来的毫秒数。 - 求出毫秒差后,再将其转换成天、小时、分钟和秒。每单位的换算公式为: - 天:`总毫秒数 / (24 * 60 * 60 * 1000)` -...

    java编程计算一个人出生日期离现在时间的毫秒值

    在Java中,`Date`类有一个`getTime()`方法,它返回从1970年1月1日(UTC)00:00:00开始到当前日期的毫秒数。如果你有一个表示出生日期的`Date`对象,你可以直接调用`getTime()`来获取这个日期距离1970年1月1日的毫秒...

    java8时间api

    4. **Instant**: `Instant` 是一个表示自1970年1月1日(UTC)以来的秒数的类,精确到纳秒。它常用于处理系统时间或者时间戳。`Instant.now()` 可以获取当前时间戳。 5. **Duration**: `Duration` 用于表示两个瞬间...

    JAVA中的时间操作

    首先,`java.util.Date`是最早的日期和时间类,它表示自1970年1月1日(UTC)以来的毫秒数。然而,`Date`类有一些设计上的不足,如不包含时区信息且易受线程安全问题的影响。因此,`java.util.Calendar`类被引入,它...

    JAVA日历时间控件

    - `java.util.Date`:这是一个基本的日期和时间类,可以表示从1970年1月1日00:00:00 GMT到现在的毫秒数。 - `java.util.Calendar`:这是个抽象类,提供了日期和时间字段之间的转换,以及日期和时间计算的功能。它...

    java时间格式大全

    1. **`java.util.Date`**: 这是Java早期用于表示时间的类,但它并不直观,因为它代表的是从1970年1月1日00:00:00 GMT以来的毫秒数。要将其转换为可读格式,我们需要使用`SimpleDateFormat`。 2. **`java.text....

    java中获取系统时间

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

    用java获取网络时间

    3. **获取日期时间**:通过`uc.getDate()`方法获取服务器端的日期时间,返回值为`long`类型,代表自1970年1月1日0时0分0秒以来的毫秒数。 4. **日期转换与格式化**: - 将获取到的`long`类型的日期时间转换为`Date`...

    JAVA日期时间的计算.pdf

    `java.util.Date`类用于表示特定的瞬间,以毫秒为单位,从1970年1月1日00:00:00 GMT开始计算。在早期版本的Java中,`Date`类提供了基本的日期时间处理功能。例如,通过调用`getTime()`方法,可以获得Date对象自1970...

    java 时间的设置与获取

    - `java.util.Date`:老版API,表示从1970年1月1日00:00:00 UTC(协调世界时)开始的毫秒数。可以使用`new Date()`创建一个实例。 - `java.time.LocalDateTime`:新API,表示没有时区信息的日期和时间,例如`...

    Java 获取日期时间代码

    - **`java.util.Date`**:用于表示特定的瞬间,即从1970年1月1日00:00:00 GMT以来的毫秒数。 - **`java.sql.Date`**:专为数据库操作设计,主要用于存储和处理日期,不包含时间信息。 - **`java.util.Calendar`**:...

    Java时间控件精确到秒

    - `Date`类是Java早期用来表示日期和时间的基础类,它可以表示从1970年1月1日(格林尼治标准时间)到现在的毫秒数。 - `Calendar`是抽象类,提供了日期和时间的抽象表示。通过`getInstance()`方法可以获得一个`...

    java的时间操作.docx

    `Date`对象表示自1970年1月1日以来的毫秒数。要获取当前时间,可以创建一个新的`Date`对象,如`new Date()`。但是,这个类本身并不提供格式化日期和时间的方法,所以我们需要借助`SimpleDateFormat`类来完成这一任务...

Global site tag (gtag.js) - Google Analytics