如何将纪元之前的日期表示为 UNIX 时间戳

How to represent dates before epoch as a UNIX timestamp

我突然想到我不知道有一种机制可以存储 1970 年 1 月之前的日期。 1 作为 Unix 时间戳。由于该日期是 Unix "epoch",这不足为奇。

但是 - 尽管它不是为此而设计的 - 我仍然希望以 Unix 格式存储很久以前的日期。
出于某些原因我需要它。

所以我的问题是:如何使 unix 时间戳包含 "invalid" 但仍然有效?存储负数的秒数会起作用吗?我们甚至可以在 unix 时间戳中存储 negative 秒数吗?我的意思是它不是未签名的吗?

此外,如果我是正确的,那么我只能存储最早 1901. dec. 13 20:45:52 的日期,是否可以通过任何方式将其进一步追溯到历史?

Unix Time is usually a 32-bit number of whole seconds from the first moment of 1970 in UTC, the epoch1 January 1970 00:00:00 UTC。这意味着大约 136 年的范围,时代的两边各有一半左右。负数更早,零是纪元,正数更晚。对于带符号的 32 位整数,值的范围从 1901-12-132038-01-19 03:14:07 UTC

这不是一成不变的。好吧,它 写的,但是是用一堆不同的石头写的。老的说 32 位,新的说 64 位。一些规范说其含义是“实现定义的”。一些 Unix 系统使用 unsigned int 来仅扩展到纪元之后的未来,但通常的做法是使用带符号的数字。有些使用浮点数而不是整数。有关详细信息,请参阅 Unix Time, and this Question.

上的维基百科文章

所以,基本上,你的问题没有意义。您必须了解您的编程语言(标准 C、其他 C、Java 等)、环境(POSIX 兼容)、特定软件库或数据库存储或应用程序的上下文。

避免从纪元开始计数

除了缺乏特异性外,a couple dozen other epochs 已被各种软件系统使用,其中一些非常流行和常见。例如,NTFS 文件系统和 COBOL 为 1601 年 1 月 1 日,各种 FAT 文件系统为 1980 年 1 月 1 日,Apple Cocoa 为 2001 年 1 月 1 日,Excel 和 Lotus 1- 为 1900 年 1 月 0 日2-3 个电子表格。

进一步补充使用了不同粒度的计数这一事实。除了整秒,一些系统还使用毫秒、微秒或纳秒。

我建议不要将日期时间作为从纪元开始的计数来跟踪。而是使用您的编程语言或数据库中可用的特定数据类型。

ISO 8601

当数据类型不可用或交换数据时,请遵循 ISO 8601 标准,该标准为各种日期时间值定义了合理的字符串格式。

  • 日期
    • 2015-07-29
  • 与 UTC 有偏移的日期时间(对于 UTC,Z 为零/Zulu)(注意在偏移处填充零)
    • 2015-07-29T14:59:08Z
    • 2001-02-13T12:34:56.123+05:30
  • 周(有或没有星期几)
    • 2015-W31
    • 2015-W31-3
  • 序号日期(一年中的某天)
    • 2015-210
  • 区间
    • "2007-03-01T13:00:00Z/2008-05-11T15:30:00Z"
  • 持续时间(PnYnMnDTnHnMnS 的格式)
    • P3Y6M4DT12H30M5S = "三年六个月四天十二小时三十分五秒"

搜索 whosebug.com 以获得更多关于这些主题的问题和答案。