Python的:一天总是86,400秒?

Is a day always 86,400 epoch seconds long?

在回顾我过去的答案时,我注意到我提出了如下代码:

1
2
3
4
5
6
7
8
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)

当我重读这段代码的时候,我禁不住感觉到我脊背上的小马托尼的可怕的触摸,轻轻地向我的耳朵低语"跳跃秒"和其他如此可怕的事情。

"一天有86400秒长"的假设何时被打破,对于"秒"的时代定义,如果有的话?(我假设python的time.mktime等函数已经返回了DST调整值,所以上面的代码段也应该在DST切换日工作……我希望?)


无论何时进行日历计算,使用平台提供的任何API(如python的日历模块或成熟的高质量库)几乎总是比自己编写"更简单"的代码要好。日历API是丑陋和复杂的,但这是因为现实世界的日历有很多奇怪的行为。

例如,如果现在是"上午10:00:00",那么到"明天上午10:00:00"的秒数可能是一些不同的事情,这取决于您使用的时区、DST今晚是开始还是结束,等等。

每当代码中出现常量86400时,很有可能您所做的事情并不完全正确。

当你需要确定一周、一个月、一年、一个季度的秒数时,事情会变得更加复杂。学习使用这些日历库。


根据维基百科,

UTC days are almost always 86 400 s long, but due to"leap seconds"
are occasionally 86 401 s and could be 86 399 s long (though the
latter option has never been used as of December 2010); this keeps the
days synchronized with the rotation of the Earth (or Universal Time).

我预计,如果要用的话,一个双闰秒实际上会使86402天变长。

再次编辑:由于混淆了Python文档,第二个猜测是我自己。time.mktime总是返回UTC epoch秒。完成了。:)


一天中的秒数取决于您使用的时间系统,例如,在POSIX中,一天定义为86400秒:

As represented in seconds since the Epoch, each and every day shall be
accounted for by exactly 86400 seconds.

在UTC中,可能包含闰秒,即一天可以是86401 si秒(理论上是86399 si秒)。截至2015年6月30日,已经发生了26次。

如果我们用太阳的表观运动来测量天,那么(太阳)日的长度在一年中与平均值相差约16分钟。

反过来,它不同于同样基于地球自转(平均太阳时间)的UT1。明显的太阳日比平均太阳日短20秒或长30秒。通过引入偶尔的跨部门闰秒,UTC保持在UT1的0.9秒内。

如果你用当地的时钟来定义一天,那么它可能会因为奇怪的政治时区变化而非常混乱。由于DST,假设一天只会改变一小时是不正确的。


在所有"支持"夏令时的时区,一年有两天没有24小时,分别是25小时和23小时。别想硬编码那些日期。它们每年都在时区之间变化。

哦,这里有34个你没有想到的其他原因,以及为什么你不应该做你正在做的事情。