2010-03-28 126 views
38

使用日期(1970年1月1日)作为时间操作的默认标准是否有任何理由?我已经在Java和Python中看到过这个标准。我知道这两种语言。还有其他流行的语言是否遵循相同的标准?为什么从1970年1月1日起计算日期?

请说明。

+0

遵循同样的标准另一种流行的语言中使用由新java.time package是PHP,它的一个相当普遍的时间起点。 – 2010-03-28 16:37:20

回答

39

它是Unix time.

Unix时间的标准,或POSIX时间,是用于在时间来描述点的系统,定义为自1午夜proleptic协调世界时(UTC)经过的秒数1970年1月,不算闰秒。

+3

你知道Kernighan和Thompson是否每个人都表达了选择那个时刻之外的理由:“在我们开始建造这个东西之前,这是一个圆整的数字。”? – dmckee 2010-03-28 17:03:38

+0

这是一年的开始,它在零时区(祖鲁)。这两个都使日期格式代码更简单。 – 2010-03-28 17:48:14

+14

不计算闰秒?我不知道那个细节。想了一会儿,我明白了为什么你会那样做,但是男人。我的世界被粉碎了。由24秒。 – keturn 2010-03-28 19:08:44

0

是的,C(及其家族)。这也是Java采用它的地方。

+1

感谢您指点。但为什么? – 2010-03-28 16:22:08

5

使用日期(1970年1月1日)作为时间操纵的标准有什么理由吗?

没有理由。

Python的time模块的C库。问肯·汤普森他为什么选择这个日期来创造一个划时代的日子。也许这是某人的生日。

Excel使用两个不同的时代。任何不同版本的Excel使用不同日期的原因?

除了实际的程序员,其他人都不知道为什么这些决定是由那些决定。

而且......

为什么选择的日期不要紧。它就是这样。

天文学家利用自己的具有划时代意义的日期:http://en.wikipedia.org/wiki/Epoch_(astronomy)

为什么?必须选择一个日期才能使数学计算出来。任何随机日期都可以使用。

以往的日期避免了一般情况下的负数。

一些更聪明的软件包使用了格雷戈里年的第一年。任何第一年的理由?
在Calendrical Calculations等书籍中给出了一个原因:它在数学上稍微简单一些。

但是,如果你仔细想一想,1/1/1和1/1/1970之间的差异仅仅是1969年,这是一个微不足道的数学抵消。

+0

如果选择了1/1/1,我们现在已经用完了秒数(2^31)。就目前而言,我们在2038年面对32位操作系统的Y2K问题。 http://en.wikipedia.org/wiki/Year_2038_problem – 2010-03-29 04:17:40

+0

@克里斯纳瓦:使用1/1/1天数的人,而不是秒。 20亿天约为500万年。通常他们保留一个(日,时间)对以最大化时间分辨率;大多数日子只有86400秒。 – 2010-03-29 10:05:43

+0

@ S.Lott:是的。我只是指出,由于大多数软件在这个时代以秒为单位(而非分钟),因此1/1/1远远超过了合理的开始日期。因此,选择了更近的日期作为计算机时代(并且通过联想开始了IT革命.-) – 2010-03-29 14:15:58

2

Q)“为什么从1970年1月1日起计算日期?”

A)它必须尽可能近,但包括一些过去。 很可能没有其他重要的原因,因为很多人都有同样的感受。

他们知道如果把它放在过去太过分了,并且他们知道如果它将来会带来负面结果,它就会出现问题。过去没有必要更深入,因为事件很可能在未来发生。

注: 玛雅人,在另一方面,有需要的地方事件成为过去,因为有很多过去的,为此,他们做了一个长期压光机的知识。只是将所有常规现象放在日历上。

时间戳不是一个日历,它是一个时代。我相信玛雅人用同样的观点制作了他们的长期日历。 (这意味着他们知道他们与过去没有任何关系,他们只是需要看到它在更大的规模)

2

为什么它始终第一1970年,因为 - '1970年1月1日'通常被称为因为“纪元日期”是Unix计算机启动时间的日期,并且该时间戳被标记为“0”。自该日期以来的任何时间都是基于经过的秒数来计算的。用简单的话来说......任何日期的时间戳将在该日期和'1970年1月1日'之间以秒为单位的时间戳。时间戳记只是一个从1970年1月1日午夜的数字'0'开始的整数,并且继续递增每次第二次通过'1'将UNIX时间戳转换为可读日期PHP和其他开源语言提供了内置函数。

23

的问题提出了两个错误的假设:

  • 所有的计算时间跟踪的计数,因为,1970年完成。
  • 这种跟踪是标准的。

二十二历元

时间计算是并不总是从1970年UTC开始跟踪。虽然这个epoch很受欢迎,但几十年来的各种计算环境至少使用了近two dozen epochs。有些来自其他世纪。它们的范围从年0(零)到2001年

Unix的时代常见的,但不占优势

1970年开始流行,可能是由Unix其使用感觉。但绝不占主导地位。例如:

  • 数百万的Microsoft Excel中(10亿?)&的Lotus 1-2-3文件使用January 0, 1900(1899年12月31日)。
  • 现在世界上有over a billion iOS/OS X devices使用的1 January 2001, GMT
  • GPS卫星导航系统使用January 6, 1980而欧洲替代Galileo使用22 August 1999

ISO 8601

假设计数纪元以来使用的Unix时代是开放的错误一大漏洞。这样的计数对于人类来说是不可能立即破译的,因此在调试和记录时不容易标记错误或问题。另一个问题是下面解释的粒度的模糊性。

我强烈建议,而不是序列化日期时间值作为明确的ISO 8601字符串数据交换,而不是一个整数计算纪元以来的:YYYY-MM-DDTHH:MM:SS.SSSZ2014-10-14T16:32:41.018Z

计数什么自纪元

与计数纪元以来的时间跟踪的另一个问题是时间单位,与常用至少四个级别的分辨率。


  • 原来的Unix工具使用的全秒,导致Year 2038 Problem自1970年以来,当我们到达秒的限制,如果存储为32位整数。
  • ​​
    由较旧的Java库(包括捆绑的java.util.Date类和Joda-Time库)使用。
  • Microseconds
    由数据库使用,如Postgres
  • Nanoseconds
    在Java中8

Diagram showing different software counting from epoch by seconds, milliseconds, microseconds, or nanoseconds.

相关问题