我正在使用datetime.fromtimestamp
将纪元时间转换为当地时间。我发现datetime.fromtimestamp
在某个时间点发生了一小时的离散跳跃,我完全不知道为什么会这样做。
(我也使用time.mktime
将日期时间对象转换为纪元时间as suggested by Raymond Hettinger。我不确定这是否是此问题的相关信息,所以我只是在说情况)。
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time, datetime
>>> def datetime_to_epoch_time(datetime_):
... return time.mktime(datetime_.timetuple()) + datetime_.microsecond / 1e6
...
选择一个特定的纪元时间:
>>> x = datetime_to_epoch_time(datetime.datetime(2012, 3, 30, 3, 0))
使用fromtimestamp
将其转换为日期时间:
>>> datetime.datetime.fromtimestamp(x)
datetime.datetime(2012, 3, 30, 3, 0)
我们得到凌晨3点的时间。
现在让我们转换它之前正好一秒钟的时间:
>>> datetime.datetime.fromtimestamp(x-1)
datetime.datetime(2012, 3, 30, 1, 59, 59)
我们突然得到凌晨1:59!
发生什么事了?我知道这样的事情发生在闰日附近,但是从3月30日开始是闰日?
我应该注意到,我只在Linux上而不是在Windows上发生过这种情况。我认为不同的Linux计算机(在不同的时区)有不同的时间点fromtimestamp
进行跳转。
答案 0 :(得分:9)
fromtimestamp
使用当前用户的“本地环境”,由POSIX C库定义(请参阅man (3) tzset
和time
模块的文档)。
如果您真的希望获得当前用户环境本地时间的pytz
表示,datetime-tz
包具有自动检测它的功能。
但是,常识是始终使用UTC,并避免所有DST问题(仅使用本地时区进行最终显示)。使用datetime.fromtimestamp(x, tz=pytz.UTC)
,或者,如果您没有pytz
:
>>> datetime.datetime.fromtimestamp(x)
datetime.datetime(2012, 3, 30, 3, 0)
>>> datetime.datetime.utcfromtimestamp(x)
datetime.datetime(2012, 3, 30, 0, 0)
>>> datetime.datetime.utcfromtimestamp(x-1)
datetime.datetime(2012, 3, 29, 23, 59, 59)
P.S。您还可以将进程的区域设置设置为UTC(但这可能不适用于非POSIX OS):
>>> import os,time
>>> os.environ["TZ"] = "UTC"
>>> time.tzset()
>>> datetime.datetime.fromtimestamp(x)
datetime.datetime(2012, 3, 30, 0, 0)
答案 1 :(得分:4)
易。 3月30日可能是您时区的夏令时转换。
所以那天,确实时间从1:59:59到3:00:00