【问题标题】:What does python return on the leap secondpython在闰秒返回什么
【发布时间】:2016-09-25 11:59:26
【问题描述】:

pythontimedatetime 模块在闰秒返回什么?

如果我打电话,当我们在 23:59:60.5 时,我会得到什么:

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

还有,py2.7和py3有什么区别?


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

datetime docs我看到了:

与时间模块不同,日期时间模块不支持闰秒。

time docs 上,我看到使用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

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

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

我读过关于橡胶时间、时钟减慢、重复秒数以及各种疯狂的想法,但我应该对 python 有什么期望?

注意:如果你想知道我是否没有更好的事情来关心它,闰秒即将到来!!!!

【问题讨论】:

  • 我预计不会发生任何事情。您的计算机时钟不会遵守闰秒;它将一直持续到下一次 ntp 时钟同步,之后您的计算机时钟将再次正确。
  • 如果你想要一个支持闰秒的日期时间,试试 astropy.time
  • @MarioCorchero:是的,会提前 1 秒。
  • @MartijnPieters:那个级别的精度是一秒,python有什么问题?我可以同意不使用计算机时钟,但我没有看到 python 的问题。
  • @MarioCorchero:Python 不是实时编程语言。当计时精度如此重要以至于闰秒会产生影响时,请勿使用它。即使是您一般使用的操作系统(Windows、OS X、Linux 等)也无法做出这样的保证。这就是 Real Time OS 的用途。

标签: python datetime time leap-second


【解决方案1】:

闰秒偶尔手动安排。目前,计算机时钟没有支持闰秒的功能;没有标准告诉他们预先插入一个。相反,计算机时钟通过 NTP 协议定期重新同步它们的时间,并在插入闰秒后自动调整。

接下来,计算机时钟通常将时间报告为自纪元以来的秒数。在将秒计数转换为包括闰秒时,由datetime 模块调整其记帐。它目前不这样做。 time.time() 只会报告基于秒数的时间计数。

因此,当闰秒正式生效时,没有什么不同,除了您的计算机时钟将在一段时间内变为 1 秒。

datetime 的问题只涉及表示闰秒时间戳,但它不能。无论如何都不会要求它这样做。

【讨论】:

  • 这是否意味着它只是“未指定”并且您的代码需要了解如何为您的机器放置 NTP? (假设你想继续使用datetime 而不是移动到像astropy.time 这样的库,谢谢@MaxNoe)
  • @MarioCorchero:不,我没有说没有指定。您的计算机时钟不知道闰秒,整个问题都被忽略了。 无论如何,您的计算机时钟不够准确,这就是使用 NTP 的原因。您的计算机始终通过该协议定期调整其时钟。您在代码中唯一需要做的就是不要假设时间总是向前推进(因为 NTP 调整和时区会导致时间倒退)。
  • @MarioCorchero:对于绝大多数程序来说,这完全不是问题。如果您的用例需要 绝对计时精度,其中 UTC 时间戳至关重要,请不要使用 Python,也不要依赖计算机时钟。改为使用专门的计时设备进行设置。
  • 谢谢,在我的特定用例中,这种行为也很好,我只是想了解它的行为方式,因为我有一些时间需要做一些算术。
  • 我认为,说一个人的计算机不知道闰秒有点过于简单化了。实际上恰恰相反:计算机时钟确实有一个“尊重”闰秒的设施(以它们自己奇怪的方式):NTP。如果计算机不知道闰秒,则 UNIX 时间将等于自纪元以来在现实世界中经过的秒数,但由于计算机确实考虑了闰秒(以一种可怕的方式),因此 UNIX 时间当前更少 如果您在现实世界的时代启动秒表并现在查看它,您会看到什么。
【解决方案2】:

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

我觉得这篇文章很好的介绍了各种问题:The Unix leap second mess

datetime 模块,正如您所观察到的,就像没有闰秒这样的东西。

【讨论】:

    猜你喜欢
    • 2016-04-20
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多