如何将纪元之前的日期表示为 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 epoch 为 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, 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 以获得更多关于这些主题的问题和答案。
我突然想到我不知道有一种机制可以存储 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 epoch 为 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, 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 以获得更多关于这些主题的问题和答案。