您是正确的,此行为与夏时制有关。避免这种情况的最简单方法是确保您使用的时区没有夏令时,UTC在这里最有意义。
datetime.datetime.utcfromtimestamp()
并calendar.timegm()
处理UTC时间,这是完全相反的。
import calendar, datetime
# Convert a unix time u to a datetime object d, and vice versa
def dt(u): return datetime.datetime.utcfromtimestamp(u)
def ut(d): return calendar.timegm(d.timetuple())
datetime.datetime.fromtimestamp()
来自文档的以下是一些解释,为什么夏时制会有问题:
返回与POSIX时间戳相对应的本地日期和时间,例如time.time()
。如果可选参数tz为None或未指定,则时间戳将转换为平台的本地日期和时间,并且返回的datetime对象是天真的。
这里的重要部分是您获得了一个幼稚的datetime.datetime
对象,这意味着没有时区(或夏令时)信息作为该对象的一部分。这意味着,如果您正好选择夏令时回滚期间的时间,则datetime.datetime
在使用时,多个不同的时间戳可以映射到同一对象fromtimestamp()
:
>>> datetime.datetime.fromtimestamp(1004260000)
datetime.datetime(2001, 10, 28, 1, 6, 40)
>>> datetime.datetime.fromtimestamp(1004256400)
datetime.datetime(2001, 10, 28, 1, 6, 40)