如何检查是否是带有时间戳的 xx:00:00?



似乎检查它是否为 xx:00:00 UTC/GMT 就像检查是否timestamp % 3600 == 0一样简单,时间戳 = 自纪元 (1970-01-01 00:00:00( 以来经过的秒数。我们可以在这里看到它:

import datetime 
print datetime.datetime.fromtimestamp(3600*24*17000)
# 2016-07-18 02:00:00

但这难道不是与闰秒相矛盾吗?事实上,从 1970-01-01 00:00:00 到 2016-07-18 02:00:00 之间经过的秒数不是 3600 的倍数,而是 3600 + 26 闰秒的倍数(从 1972 年到现在有 26 个闰秒(。


更准确地说:1970-01-01 00:00:00

和 2016-07-18 02:00:00 之间经过的秒数是3600*24*17000 + 26而不是3600*24*17000

我终于在这里找到了它:

当插入闰秒时(平均大约每一年半发生一次(,Unix 时间数在闰秒期间连续增加,在此期间自当天开始以来超过 86,400 秒,然后在闰秒结束时跳回 1,即第二天的开始

1998-12-31T23:59:59.75  915 148 799.75
1998-12-31T23:59:60.00  915 148 800.00  # leap second here
1998-12-31T23:59:60.25  915 148 800.25
1998-12-31T23:59:60.50  915 148 800.50
1998-12-31T23:59:60.75  915 148 800.75
1999-01-01T00:00:00.00  915 148 800.00  # timestamp jumps back!
1999-01-01T00:00:00.25  915 148 800.25

因此,datetime.py中可能有一些代码可以执行这种闰秒检测+跳回。这里有一个关于"闰秒"的引用,但我看不出它如何检测它是否是一个。

import datetime 
print datetime.datetime.fromtimestamp(915148799) #1999-01-01 00:59:59
print datetime.datetime.fromtimestamp(915148800) #1999-01-01 01:00:00

Python 的 datetime.datetime 对象无法处理闰秒,因为 seconds 属性限制在 0..59 范围内:

In [19]: DT.datetime(2012, 6, 30, 23, 59, 60)
ValueError: second must be in 0..59

(午夜前有一个闰秒,2012-06-30(。

因此,Python的日期时间系统并不能完全代表现实世界中存在的所有时间。它模拟了一个不存在闰秒的简化世界。

另请参阅:此 python 问题已关闭,状态为"无法修复"。

链接的页面显示mxDatetime作为可以(某种(处理闰秒的datetime.datetime的替代方案。

相关内容

  • 没有找到相关文章

最新更新