今天在看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中,通常使用NSTimeInterval,它是一个双精度浮点数,代表以秒为单位的时间间隔,同样是从1970年1月1日开始计算。 要将Java时间戳转换为iOS时间戳,我们需要将Java的毫秒值除以1000,得到秒数。以下是转换...
这里的`getTime()`方法返回的是自1970年1月1日00:00:00 UTC至指定的时间点的毫秒数,是计算时间差的关键。 #### 3. 时间单位换算 得到毫秒差后,代码进一步将其转换为更易读的形式:天、小时、分钟和秒。这涉及到...
Java 中的时间处理是基于 1970 年 1 月 1 日开始的毫秒数计算的。下面是 Java 中处理时间的相关知识点: 1. Date 类:Date 类的构造函数 Date() 返回代表当前创建的时刻的对象。Date 的方法 getTime() 返回一个 ...
Java中的时间计算基于自1970年1月1日00:00:00 UTC(协调世界时)起的毫秒数。`java.util.Date`类是处理日期和时间的基础,它的构造函数创建一个表示当前时刻的Date对象,而`getTime()`方法返回自1970年以来的毫秒数...
这里的毫秒值是从1970年1月1日00:00:00 UTC至当前时间之间的毫秒数。 2. **使用`System.currentTimeMillis()`**: - 另一种获取当前时间的方法是使用`System.currentTimeMillis()`方法。 ```java long ...
这可以通过`getTime()`方法实现,它返回Date对象自1970年1月1日00:00:00 GMT以来的毫秒数。 - 求出毫秒差后,再将其转换成天、小时、分钟和秒。每单位的换算公式为: - 天:`总毫秒数 / (24 * 60 * 60 * 1000)` -...
在Java中,`Date`类有一个`getTime()`方法,它返回从1970年1月1日(UTC)00:00:00开始到当前日期的毫秒数。如果你有一个表示出生日期的`Date`对象,你可以直接调用`getTime()`来获取这个日期距离1970年1月1日的毫秒...
4. **Instant**: `Instant` 是一个表示自1970年1月1日(UTC)以来的秒数的类,精确到纳秒。它常用于处理系统时间或者时间戳。`Instant.now()` 可以获取当前时间戳。 5. **Duration**: `Duration` 用于表示两个瞬间...
首先,`java.util.Date`是最早的日期和时间类,它表示自1970年1月1日(UTC)以来的毫秒数。然而,`Date`类有一些设计上的不足,如不包含时区信息且易受线程安全问题的影响。因此,`java.util.Calendar`类被引入,它...
- `java.util.Date`:这是一个基本的日期和时间类,可以表示从1970年1月1日00:00:00 GMT到现在的毫秒数。 - `java.util.Calendar`:这是个抽象类,提供了日期和时间字段之间的转换,以及日期和时间计算的功能。它...
1. **`java.util.Date`**: 这是Java早期用于表示时间的类,但它并不直观,因为它代表的是从1970年1月1日00:00:00 GMT以来的毫秒数。要将其转换为可读格式,我们需要使用`SimpleDateFormat`。 2. **`java.text....
1. **获取毫秒数**:`System.currentTimeMillis()`返回自1970年1月1日0时0分0秒以来的毫秒数。 2. **创建对象**:通过将上述毫秒数传递给`Date`类的构造函数,可以创建一个新的`Date`对象。 3. **输出结果**:与方法...
3. **获取日期时间**:通过`uc.getDate()`方法获取服务器端的日期时间,返回值为`long`类型,代表自1970年1月1日0时0分0秒以来的毫秒数。 4. **日期转换与格式化**: - 将获取到的`long`类型的日期时间转换为`Date`...
`java.util.Date`类用于表示特定的瞬间,以毫秒为单位,从1970年1月1日00:00:00 GMT开始计算。在早期版本的Java中,`Date`类提供了基本的日期时间处理功能。例如,通过调用`getTime()`方法,可以获得Date对象自1970...
- `java.util.Date`:老版API,表示从1970年1月1日00:00:00 UTC(协调世界时)开始的毫秒数。可以使用`new Date()`创建一个实例。 - `java.time.LocalDateTime`:新API,表示没有时区信息的日期和时间,例如`...
- **`java.util.Date`**:用于表示特定的瞬间,即从1970年1月1日00:00:00 GMT以来的毫秒数。 - **`java.sql.Date`**:专为数据库操作设计,主要用于存储和处理日期,不包含时间信息。 - **`java.util.Calendar`**:...
- `Date`类是Java早期用来表示日期和时间的基础类,它可以表示从1970年1月1日(格林尼治标准时间)到现在的毫秒数。 - `Calendar`是抽象类,提供了日期和时间的抽象表示。通过`getInstance()`方法可以获得一个`...
`Date`对象表示自1970年1月1日以来的毫秒数。要获取当前时间,可以创建一个新的`Date`对象,如`new Date()`。但是,这个类本身并不提供格式化日期和时间的方法,所以我们需要借助`SimpleDateFormat`类来完成这一任务...