【问题标题】:Why are dates calculated from January 1st, 1970? [duplicate]为什么日期从 1970 年 1 月 1 日开始计算? [复制]
【发布时间】:2021-11-24 21:37:19
【问题描述】:

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

请描述一下。

【问题讨论】:

标签: java python programming-languages


【解决方案1】:

Unix time.的标准

Unix 时间或 POSIX 时间是一种用于描述时间点的系统,定义为自 1970 年 1 月 1 日午夜预测协调世界时 (UTC) 以来经过的秒数,不包括闰秒。

【讨论】:

  • 你知道 Kernighan 和 Thompson 是否都表达了选择那个时刻的理由,而不是“在我们开始构建这个东西之前,这是一个整数。”?
  • 这是一年的开始,它位于零时区(祖鲁语)。这两者都使日期格式化代码更简单。
  • 不计算闰秒?我不知道那个细节。想了一会儿之后,我明白你为什么要那样做,但是伙计。我的世界支离破碎。 24 秒。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    1970 年 1 月 1 日 00:00:00 am 是 POSIX time 的零点。

    【讨论】:

      【解决方案4】:

      使用日期(1970 年 1 月 1 日)作为时间操作的标准是否有任何理由?

      没有重要的原因。

      Python 的time 模块 C 库。问肯汤普森为什么选择那个日期作为划时代的日期。也许这是某人的生日。

      Excel 使用两个不同的时期。为什么不同版本的excel使用不同的日期有什么原因?

      除了真正的程序员之外,没有人会知道为什么会做出这些决定。

      还有……

      选择日期并不重要为什么。就是这样。

      天文学家使用他们自己的纪元日期:http://en.wikipedia.org/wiki/Epoch_(astronomy)

      为什么?必须选择一个日期才能完成数学运算。任何随机日期都可以。

      一个远在过去的日期避免了一般情况下的负数。

      一些更智能的软件包使用预测的公历第一年。为什么是第一年?
      Calendrical Calculations 等书中给出了一个原因:它在数学上稍微简单一些。

      但如果你仔细想想,1/1/1 和 1/1/1970 之间的差异只是 1969 年,一个微不足道的数学偏移量。

      【讨论】:

      • 如果选择了 1/1/1,我们现在已经用完了秒 (2^31)。就目前而言,我们在 2038 年面临 32 位操作系统的类似千年虫的问题。 en.wikipedia.org/wiki/Year_2038_problem
      • @Chris Nava:使用 1/1/1 的人计算天数,而不是秒数。 20亿天大约是500万年。他们通常会保留(天,时间)对以最大化时间分辨率;大多数日子里只有 86400 秒。
      • @S.Lott:是的。我只是指出,由于大多数软件从纪元开始计算秒数(而不是分钟数),因此 1/1/1 在过去是一个合理的开始日期。因此,选择了一个较近的日期作为计算机时代(并由此联想到 IT 革命的开始。;-)
      • @Chris Nava:“最”?我假设“大多数”是指“Linux”。其他操作系统的工作方式与 Linux 不同。问题在于“合理”和“为什么是 1970 年 1 月 1 日?”不容易回答的问题;最重要的是,答案并不重要。 “合理”是真的,但这不是为什么的原因。 为什么只有肯·汤普森才能回答。
      【解决方案5】:

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

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

      他们知道如果将其置于过去太远会带来问题,并且他们知道如果将其置于未来则会产生负面结果。过去没有必要更深入,因为事件很可能在未来发生。

      注意事项: 另一方面,玛雅人需要将事件置于过去,因为他们了解很多过去,为此他们制作了一个长期的日历。只是为了把所有的常规现象都放在日历上。

      时间戳并不是一个日历,它是一个纪元。我相信玛雅人使用同样的视角制作了他们的长期日历。 (这意味着他们很清楚他们与过去没有任何关系,他们只是需要在更大的范围内看到它)

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 为什么日期从 1970 年 1 月 1 日开始计算?因为日期是从 1970 年 1 月 1 日开始计算的。这是循环逻辑,无法回答任何问题。
        【解决方案7】:

        使用日期(1970 年 1 月 1 日)作为默认标准

        这个问题做了两个错误的假设:

        • 计算中的所有时间跟踪都是从 1970 年开始计算的。
        • 这种跟踪是标准的。

        两打纪元

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

        这里有一些。

        公元前 1 月 0 日

        公元 1 月 1 日

        1582 年 10 月 15 日

        1601 年 1 月 1 日

        1840 年 12 月 31 日

        1858 年 11 月 17 日

        1899 年 12 月 30 日

        1899 年 12 月 31 日

        1900 年 1 月 1 日

        1904 年 1 月 1 日

        1967 年 12 月 31 日

        1980 年 1 月 1 日

        1980 年 1 月 6 日

        2000 年 1 月 1 日

        2001 年 1 月 1 日

        Unix Epoch 常见,但不占主导地位

        1970 年初很流行,可能是因为它被 Unix 使用。但绝不是那种占主导地位的。例如:

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

        ISO 8601

        假设 count-since-epoch 使用的是 Unix 纪元,这会为 bug 带来很大的漏洞。人类不可能立即破译这样的计数,因此在调试和记录时不会轻易标记错误或问题。另一个问题是下面解释的粒度不明确。

        我强烈建议将日期时间值序列化为明确的 ISO 8601 字符串以进行数据交换,而不是整数 count-since-epoch: YYYY-MM-DDTHH:MM:SS.SSSZ 例如 2014-10-14T16:32:41.018Z

        自纪元以来的什么计数

        count-since-epoch 时间跟踪的另一个问题是时间单位,通常使用至少四个级别的分辨率。

        【讨论】:

        • 我想知道此时的主导时代是什么……你是基于数据的吗?
        • @PascalVKooten 许多不同的时代用于许多不同的环境和软件系统。所以没有一个占主导地位的时代。我的观点是永远不要假设时代。了解您的数据源。最好的方法是让数据源完全避免时代问题,并且只使用 ISO 8601 字符串,恕我直言。
        • 感谢您的回复。我知道有很多,但我很想知道是否例如随着时间的推移,POSIX 变得越来越流行。
        • 这很有趣,但并没有回答为什么选择 1970 年作为 Unix 纪元。
        猜你喜欢
        • 1970-01-01
        • 2021-11-04
        • 2020-06-18
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多