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

时间:2018-01-18 18:51:12

标签: python datetime time utc leap-second

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

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

但这与leap seconds是否相矛盾?实际上,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 而不是{{1} }

2 个答案:

答案 0 :(得分:0)

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 issue已关闭,状态为“无法修复”。

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

答案 1 :(得分:0)

我终于找到了here

  

当插入闰秒时,大约每年平均发生一次半,Unix时间数在闰秒期间不断增加,在此期间,自当天开始以来,它超过86,400秒< strong>然后在闰秒结束时跳回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中的某个地方有一些代码可以实现闰秒检测+跳回。有一个“闰秒”here的引用,但我看不出它是如何检测它是否是一个。

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