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

时间:2015-07-29 18:40:59

标签: time unix-timestamp

我突然意识到我不知道在1970年之前存储日期的机制。 1作为Unix时间戳。因为那个日期是Unix" epoch"这并不令人意外。

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

所以我的问题是:如何让unix-timestamps包含"无效"但仍在工作日期?存储负数秒会有效吗?我们甚至可以在unix-timestamp中存储秒数吗?我的意思是不是没有签名?

此外,如果我更正,那么我只能在1901. dec. 13 20:45:52之前存储日期,这可以通过任何方式延伸到历史中吗?

1 个答案:

答案 0 :(得分:24)

Unix Time 通常从UTC 1970年的第一个时刻开始的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 Time上的维基百科文章和this Question

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

避免从纪元开始计数

除了这种缺乏特异性之外,各种软件系统已经使用了a couple dozen other epochs这一事实,其中一些非常受欢迎且常见。示例包括1601年1月1日的NTFS文件系统& COBOL,1980年1月1日,用于各种FAT文件系统,2001年1月1日用于Apple Cocoa,以及1900年1月0日用于Excel& Lotus 1-2-3电子表格。

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

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

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上搜索有关这些主题的更多问题和解答。