我突然意识到我不知道在1970年之前存储日期的机制。 1作为Unix时间戳。因为那个日期是Unix" epoch"这并不令人意外。
但是 - 即使它不是为此而设计的 - 我仍然希望以Unix格式存储过去的日期。
我需要这个原因。
所以我的问题是:如何让unix-timestamps包含"无效"但仍在工作日期?存储负数秒会有效吗?我们甚至可以在unix-timestamp中存储负秒数吗?我的意思是不是没有签名?
此外,如果我更正,那么我只能在1901. dec. 13 20:45:52
之前存储日期,这可以通过任何方式延伸到历史中吗?
答案 0 :(得分:24)
Unix Time 通常从UTC 1970年的第一个时刻开始的32位整数秒,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上的维基百科文章和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标准,该标准为各种日期时间值定义合理的字符串格式。
2015-07-29
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上搜索有关这些主题的更多问题和解答。