【问题标题】:How to represent dates before epoch as a UNIX timestamp如何将纪元之前的日期表示为 UNIX 时间戳
【发布时间】:2015-10-20 21:59:40
【问题描述】:

我突然想到,我不知道存储 1970 年 1 月之前日期的机制。 1 作为 Unix 时间戳。由于那个日期是 Unix“纪元”,这并不令人意外。

但是 - 即使它不是为此而设计的 - 我仍然希望以 Unix 格式存储很久以前的日期。
我需要这个是有原因的。

所以我的问题是:如何让 unix-timestamps 包含“无效”但仍然有效的日期?存储负数的秒数会起作用吗?我们甚至可以在 unix 时间戳中存储 秒吗?我的意思是它不是未签名的吗?

另外,如果我是正确的,那么我只能将日期存储在 1901. dec. 13 20:45:52 上,这可以通过任何方式在历史上进一步延长吗?

【问题讨论】:

  • Unix time_t 是一个有符号的 32 位整数,所以它可以回到 1901,正如你所指出的。你应该检查你的操作系统,许多已经将time_t 扩展到 64 位,这给了你几千亿年的余地。

标签: time unix-timestamp


【解决方案1】:

Unix Time通常是从 1970 年 UTC 开始的 32 位整秒数,epoch1 January 1970 00:00:00 UTC。这意味着大约 136 年的范围,其中大约一半在时代的两侧。负数较早,零是纪元,正数较晚。对于带符号的 32 位整数,值的范围从 1901-12-132038-01-19 03:14:07 UTC

这不是一成不变的。嗯,它写的,但是是用一堆不同的石头写的。旧的说 32 位,新的说 64 位。一些规范说意思是“实现定义的”。一些 Unix 系统使用 unsigned int 仅扩展到过去的未来,但通常的做法是使用有符号数。有些使用浮点数而不是整数。有关详细信息,请参阅有关 Unix Timethis Question 的 Wikipedia 文章。

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

避免 Count-From-Epoch

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

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

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

ISO 8601

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

  • 日期
    • 2015-07-29
  • 与 UTC 有偏移的日期时间(Z 为零/Zulu 对于 UTC)(注意在偏移量上填充零)
    • 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 = "三年六个月四天十二小时三十分钟五秒"

在 StackOverflow.com 上搜索有关这些主题的更多问题和解答。

【讨论】:

  • 太棒了,虽然我担心它会归结为implementation-defined
  • Perl 的 localtime 也从 1900 年 1 月 0 日开始计算,尽管这被引用为数字数组而不是自纪元以来的秒数
猜你喜欢
  • 2018-08-03
  • 2013-01-08
  • 2020-02-21
  • 2014-01-25
  • 2021-02-19
  • 2020-12-12
  • 2013-02-27
  • 2019-04-20
  • 2013-05-07
相关资源
最近更新 更多