一天是否总是86400个纪元秒?

48 投票
4 回答
34964 浏览
提问于 2025-04-17 03:04

在回顾我之前的回答时,我发现我提过一些代码,比如这个

import time

def dates_between(start, end):
  # muck around between the 9k+ time representation systems in Python
  # now start and end are seconds since epoch

  # return [start, start + 86400, start + 86400*2, ...]
  return range(start, end + 1, 86400)

当我重新阅读这段代码时,不禁感到一阵不寒而栗,仿佛有个叫Tony the Pony的家伙在我耳边轻声说着“闰秒”,还有其他一些可怕的事情。

那么,“一天有86,400秒”这个假设在什么情况下会出错呢?特别是当我们定义“秒”的时候?(我想像Python的time.mktime这样的函数应该已经考虑了夏令时的调整,所以上面的代码在夏令时切换的日子也应该能正常工作……我希望如此?)

4 个回答

14

根据维基百科的说法,

UTC(协调世界时)的一天通常是86400秒,但由于“闰秒”的存在,有时会变成86401秒,甚至可能会是86499秒(不过截至2010年12月,这种情况从未发生过);这样做是为了让一天的长度和地球自转保持一致。

我认为,如果真的使用双闰秒的话,一天可能会变成86402秒。

再编辑一下:我之前有点困惑,因为Python的文档让我感到迷惑。time.mktime总是返回UTC的时间戳秒数。好了,明白了。: )

15

一天的秒数取决于你使用的时间系统。例如,在POSIX标准中,一天被定义为正好86400秒:

从纪元(Epoch)开始计算,每一天都应该正好是86400秒。

在协调世界时(UTC)中,可能会有一个闰秒的情况,也就是说,一天可能是86401秒(理论上也可能是86399秒)。截至2015年6月30日,这种情况发生过26次

如果我们根据太阳的运动来计算一天,那么一天的长度在一年中会有大约16分钟的变化

这和UT1不同,UT1也是基于地球的自转(平均太阳时间)。一个明显的太阳日可能比平均太阳日短20秒或长30秒。为了保持UTC与UT1之间的差距在0.9秒以内,会偶尔加入闰秒。

如果你根据当地的时钟来定义一天,那么由于奇怪的政治时区变化,这可能会变得非常混乱。假设一天只会因为夏令时(DST)而变化一个小时是不正确的。

24

在进行日期计算时,最好使用平台提供的API,比如Python的datetimecalendar模块,或者一些成熟的高质量库,而不是自己写看似“简单”的代码。日期和日历的API看起来复杂且难以理解,但这都是因为现实中的日历有很多奇怪的规则。

举个例子,如果现在是“上午10:00:00”,那么到“明天上午10:00:00”之间的秒数可能会有几种不同的计算方式,这取决于你使用的时区、今晚是否开始或结束夏令时等等。

如果你的代码中出现了常量86400,那很可能你做的事情不太对劲。

而且,当你需要计算一周、一个月、一年、一个季度等的秒数时,事情会变得更加复杂。学会使用这些日历库吧。

撰写回答