【发布时间】:2013-07-17 23:23:37
【问题描述】:
好的,首先让我说我的时区是 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.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()。
【问题讨论】:
-
使用 Python 2.7.5 和 pytz 2013b,我得到了不同且一致的结果:
datetime.timedelta(0, 3600)。分别为datetime.timedelta(0, 7200)和datetime.timedelta(0, 3600)。在运行测试之前,我将时区设置为 CET。 -
尝试在 cli 上手动遍历 utcoffset 和 _isdst 函数中的行,代码见此处:bazaar.launchpad.net/~stub/pytz/devel/view/head:/src/pytz/… 看看你是否能看到任何错误。
标签: python timezone pytz timezone-offset