python在闰秒上返回什么

Mar*_*ero 8 python time datetime leap-second

python timedatetime模块在闰秒上返回什么?

如果我致电:23:59:60.5,我会得到什么:

  • time.time()
  • datetime.datetime.utcnow()
  • datetime.datetime.now(pytz.utc)

另外,py2.7和py3之间有什么区别?


为什么它令人困惑(至少对我而言):

日期时间文档我看到:

与时间模块不同,datetime模块不支持闰秒.

时间文档上,我看到解析时有闰秒的"支持" strptime.但是没有评论time.time().

我看到使用time我得到:

>>> time.mktime(time.strptime('2016-06-30T23:59:59', "%Y-%m-%dT%H:%M:%S"))
1467327599.0
>>> time.mktime(time.strptime('2016-06-30T23:59:60', "%Y-%m-%dT%H:%M:%S"))
1467327600.0
>>> time.mktime(time.strptime('2016-07-01T00:00:00', "%Y-%m-%dT%H:%M:%S"))
1467327600.0
Run Code Online (Sandbox Code Playgroud)

然后datetime爆炸:

>>> dt.datetime.strptime('2016-06-30T23:59:60', "%Y-%m-%dT%H:%M:%S")
Traceback (most recent call last):
  File "<stdin>", line 1, in &lt;module>
ValueError: second must be in 0..59
Run Code Online (Sandbox Code Playgroud)

那么在那个确切的时间(闰秒中间)我会得到什么?

我已经阅读过关于橡胶时代,时钟减速,重复几秒钟以及各种疯狂想法的内容,但我对python有什么期望呢?

注意:如果你想知道我是否有更好的关注它,那么闰秒即将来临!

Mar*_*ers 7

seconds秒有时是手动安排的。当前,计算机时钟无法满足leap秒的要求。没有标准告诉他们预先插入一个。相反,计算机时钟会通过NTP协议定期重新同步其时间,并在插入leap秒后自动进行调整。

接下来,计算机时钟通常以单位报告时间。datetime当将第二个计数转换为包括leap秒时,将由模块来调整其记帐。目前不这样做。time.time()只会自秒数起报告秒数。

因此,当the秒正式生效时,除了您的计算机时钟只有一秒钟的时间之外,不会发生任何其他变化

与该问题datetime只盖表示闰秒的时间戳,它不能。无论如何,它不会被要求这样做。

  • @MarioCorchero:不,我没有说它没有指定。您的计算机时钟不知道闰秒,整个问题都被忽略了。您的计算机时钟几乎不够准确*无论如何*,这就是使用NTP的原因。您的计算机始终通过该协议定期调整其时钟。您在代码中唯一需要做的就是不要假设时间总是向前推进(因为 NTP 调整和时区会导致时间倒退)。 (2认同)

mor*_*ahl 5

Python 的mktime行为几乎只是继承自 C 的行为,这是由 POSIX 指定的。规范并不像您想象的那么简单,实际情况甚至更加复杂。

我认为这篇文章很好地介绍了各种问题:Unix 闰秒混乱

正如您所观察到的,该datetime模块的行为就像不存在闰秒这样的东西一样。