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

Wol*_*fer 21 time unix-timestamp

在我看来,我不知道在1970年之前存储日期的机制.1作为Unix时间戳.由于那个日期是Unix"时代",这并不奇怪.

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

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

此外,如果我是正确的那么我只能存储日期,因为它1901. dec. 13 20:45:52可以在任何方式进一步延伸回历史?

Bas*_*que 34

UNIX时间通常从1970年在UTC的第一刻的全部秒的32位数字,该时期1 January 1970 00:00:00 UTC.这意味着大约136年的范围,在这个时代的任何一边约有一半.负数较早,零是时期,正数是较晚的.对于带符号的32位整数,值的范围1901-12-132038-01-19 03:14:07 UTC.

这不是一成不变的.嗯,这写的,但在一堆不同的石头.较老的人说32位,较新的64位.一些规格是意思是"实现定义".一些Unix系统使用unsigned int仅延伸到将来的时间段,但通常的做法是签名号码.有些使用浮点而不是整数.有关详细信息,请参阅有关Unix时间的维基百科文章和本期课题.

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

避免Count-From-Epoch

除了这种缺乏特异性之外,各种软件系统已经使用了几十个其他时代,其中一些非常受欢迎且常见.示例包括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偏移的日期时间(对于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 ="三年,六个月,四天,十二小时,三十五分五秒"

搜索StackOverflow.com以获取有关这些主题的更多问题和解答.