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

问题描述 投票:0回答:1

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

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

所以我的问题是:如何使 unix 时间戳包含“无效”但仍然有效的日期?存储负数的秒数有用吗?我们甚至可以在 unix 时间戳中存储“负”秒数吗?我的意思是不是没有签名吗? 另外,如果我是正确的,那么我只能存储最早的日期

1901. dec. 13 20:45:52

这可以通过任何方式在历史上进一步延伸吗?

    

time unix-timestamp
1个回答
58
投票
Unix 时间

通常 是从 UTC 1970 年第一时刻开始的 32 位整秒数,纪元1 January 1970 00:00:00 UTC。这意味着大约 136 年的范围,其中大约一半位于纪元两侧。负数表示较早,零表示纪元,正数表示较晚。对于有符号 32 位整数,值范围从

1901-12-13
2038-01-19 03:14:07 UTC
这并不是一成不变的。嗯,它是写在一堆不同的石头上的。老的说32位,新的说64位。有些规范说含义是“实现定义的”。一些 Unix 系统使用 unsigned int 来仅扩展到过去纪元的未来,但通常的做法是使用有符号数。有些使用浮点数而不是整数。有关详细信息,请参阅维基百科关于 

Unix Time

的文章和 this Question 所以,基本上,你的问题没有意义。您必须了解您的编程语言的上下文(标准 C、其他 C、Java 等)、环境(符合 POSIX)、特定软件库、数据库存储或应用程序。 避免从纪元开始计数

除了缺乏特异性之外,还有以下事实:

其他几十个时代

已被各种软件系统使用,其中一些非常流行和常见。例如,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 上搜索有关这些主题的更多问题和解答。

© www.soinside.com 2019 - 2024. All rights reserved.