`
mixer_b
  • 浏览: 115612 次
社区版块
存档分类
最新评论

计算机时间、unix时间、linux时间、java时间为何以1970年1月1日为原点?从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,中文网页根本找不到答案。于是试着搜索英文关键字,在Sunjava论坛总算找到准确的帖子:
http://forums.sun.com/thread.jspa?threadID=595140&start=15
其中有一个回复:
I suspect that Java was born and raisedon 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点。
我想以上问题如果作为面试题,也能难倒一批人了.

分享到:
评论

相关推荐

    c# 计算自1970-1-1 为起始时间 加上时间段为n秒后的现在的日期,绝对准确

    Unix时间戳是一种表示时间的方式,它定义为从1970年1月1日午夜开始到某个特定时刻的总秒数。这是一种非常常用的时间表示方式,在计算机科学中被广泛采用。 ### 二、算法设计与实现 #### 2.1 总体思路 为了计算从...

    将 Unix 时间(自 1970 年 1 月 1 日以来的秒数)转换为 MATLAB 串行时间:将 Unix 时间转换为 MATLAB 串行时间。-matlab开发

    % 考虑到 Unix 时间从 1970 年开始,而 MATLAB 从 1900 年开始,我们需要计算差值 baseDiff = datenum(1970, 1, 1) - datenum(1900, 1, 1); % 将 Unix 时间戳转换为日期时间对象 datetimeObj = datetime(unix...

    C# 时间转为1970年至今的秒数.txt

    此过程对于与Unix时间戳交互的应用程序尤为重要,因为Unix时间戳通常表示为从1970年1月1日午夜(UTC)以来经过的秒数。 ### C# 时间转换为自1970年以来的秒数 #### 1. 理解Unix时间戳 首先,我们需要理解Unix...

    windows时间与unix时间转换程序 UnixWin时间转换程序

    在IT领域,时间戳是记录事件发生时间的一种方式,它通常以秒或毫秒为单位,自1970年1月1日(UTC)零时起计算。两种主要的时间戳格式是Unix时间(也称为POSIX时间)和Windows时间。Unix时间广泛应用于Linux和Unix系统...

    gps-time.js:小型实用程序,用于在GPS纪元(1980年1月6日午夜)和Unix纪元(1970年1月1日午夜)之间转换时间,并考虑了leap秒

    gps-time.js 小型实用程序,用于在GPS纪元(1980年1月6日午夜)和Unix纪元(1970年1月1日午夜)之间转换时间,并考虑了leap秒。 在所有时间输入上添加恒定数量的leap秒并不是一件容易的事! 对于任何两次,它们之间...

    将Unix时间time_t扩展到2106-02-07 06:28:16 (原本Unix时间只能支持到2038-01-19 03:14:07)

    Unix时间是从1970年1月1日(UTC)零时开始计算的秒数,不包括闰秒。由于最初使用32位整数来存储这个值,其范围限制在大约1.475亿秒,即从1970年到2038年。当这个时间戳达到最大值后,如果继续递增,它将回绕到一个...

    Linux/Unix关于时间和时间戳的命令行

    时间戳,正如描述中所指出的,是一个数字,代表自1970年1月1日(UTC时间)00:00:00以来的秒数。在编程和系统管理中,时间戳广泛用于记录事件发生的具体时间,例如用户登录、活动开始或结束等。 在Linux/Unix中,`...

    易语言转换Unix时间模块源码

    Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不包括闰秒,通常用于网络数据交换。 标题提到的"易语言转换Unix时间模块源码"是一个实现了这种转换功能的代码示例。它利用了操作系统提供的API函数...

    time1970计算器

    在计算机科学中,1970年1月1日0时0分0秒(UTC)被用作一个重要的时间参考点,称为Unix时间戳或POSIX时间。这个时间点以来的秒数通常用于表示和处理时间,尤其是在编程和系统管理中。这款计算器可以帮助用户方便地将...

    Harley Hahn's Guide to Unix and Linux(中文译名:《Unix & Linux大学教程》)

    Harley Hahn在书中传达了一个重要观点:无论你出于何种原因学习Unix或Linux,或者为什么拿起这本书,都不重要。你可能是出于对计算机的热爱,有强烈的欲望去学习;也可能是你在参加一个课程,这本书将成为你的教科书...

    Unix AND Linux

    Linux 是 Unix 的一个变种,由 Linus Torvalds 在 1991 年开发的。Linux 是免费的、开放式的操作系统,具有 Unix 的所有特点,并且还添加了一些新的功能。 Unix 和 Linux 的区别在于: * 版权:Unix 是一个商业...

    GPS时间转化成标准时间格式.docx

    这意味着,GPS 时间是以 Unix 时间戳为基础的,Unix 时间戳是一个自 1970 年 1 月 1 日零点开始计数的秒数。因此,GPS 时间可以通过将 Unix 时间戳加上一个偏移值来获得。 现在,让我们来看一下标准时间格式的表示...

    Understanding Unix/Linux Programming

    《理解Unix/Linux编程》这本书是Unix/Linux编程领域的经典之作,旨在帮助读者深入理解这两个操作系统的核心原理和编程技术。书中的内容不仅涵盖了基础的系统调用、文件操作,还包括进程管理、网络编程等高级主题,是...

    java代码中调用linux/unix命令

    本文将详细介绍如何在Java代码中调用Linux/Unix命令,以及相关的技术要点。 首先,Java提供了`Runtime`类和`ProcessBuilder`类来执行外部命令。`Runtime.getRuntime().exec()`方法是较早的方式,而`ProcessBuilder`...

    linux编程中关于时间编程

    - **`time()`**:此函数返回从1970年1月1日0点(又称Unix纪元)到现在的秒数,存储在`time_t`类型变量中。这是一种常见的获取当前时间的方式,适用于大多数情况。 - **`gettimeofday()`**:此函数提供更高精度的时间...

    delphi 实现 时间戳转 换为 本地时间(支持<=10位,=13位)

    时间戳通常以Unix时间戳的形式表示,它是一个从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不包括闰秒。在Delphi中,将这种时间戳转换为本地时间或者反过来,需要一些特定的函数和方法。本文将详细介绍如何在...

    LINUX_UNIX设计思想

    作为开发Unix多年的专家,Mike Gancarz曾说过:“要想成为计算机的主人,而不是它的奴隶,你就应该使用Linux!”有别于市面上的其他关注如何使用Linux的书籍,《Linux/Unix设计思想》讲述的是“Linux的思维方式”,...

    unix里面java开发的详细介绍

    1970年,他和Dennis Ritchie完成了最初的Unix版本,即UNiplexed Information and Computing System,后被简化为UNIX。这一年也被视为Unix诞生的元年。 - **版本演进** Unix经历了快速的发展阶段,1971年发布了...

    各种语言获取Unix时间戳的方法

    在C#中,可以通过`DateTime.Now.ToUniversalTime().Ticks`获取当前时间的tick值,然后减去1970年1月1日到1900年1月1日之间的tick差值,并除以10000000转换为秒数。 ```csharp long unixTimestamp = (DateTime....

Global site tag (gtag.js) - Google Analytics