好的,首先让我说我的时区是 CET/CEST。它从 CEST 变为 CET(从 DST(即 GMT+2)返回到正常(即 GMT+1))的确切时刻始终是 10 月的最后一个星期日凌晨 3 点。2010 年是 10 月 31 日凌晨 3 点。
现在注意以下几点:
>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)
如上所述,这是错误的。
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)
现在它突然正确了:/
我知道已经有几个问题,但给出的解决方案始终是“使用本地化”,但我的问题是 LocalTimezone 不提供该方法。
事实上,我有几个以毫秒为单位的时间戳,我需要本地时区的 utcoffset(不仅是我的,还有任何使用该程序的人)。其中之一是我的时区中的 1288483950000 或 Sun Oct 31 2010 02:12:30 GMT+0200 (CEST)。
目前我执行以下操作来获取 datetime 对象:
datetime.datetime.fromtimestamp(int(int(millis)/1E3))
这可以在几分钟内获得 utcoffset:
-int(local_tnz.utcoffset(date).total_seconds()/60)
不幸的是,这在很多情况下都是错误的:(。
有任何想法吗?
注意:我使用的是 python3.2.4,在这种情况下并不重要。
编辑:
感谢@JamesHolderness,找到了解决方案:
def datetimeFromMillis(millis):
return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))
def getTimezoneOffset(date):
return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)
local_tz 等于 tzlocal 模块中的 tzlocal.get_localzone() 。