从时区偏移量本地化日期时间(时区感知)

Dio*_*lor 0 python pytz python-datetime python-dateutil

我有一个 UTC 时间戳和一个时区偏移时间戳(均以毫秒为单位):

utc_time = 1394452800000
timezoneoffset = -14400000
Run Code Online (Sandbox Code Playgroud)

如果我想得到datetime我会做的:

print datetime.utcfromtimestamp(utc_time/1000)
>>>2014-03-10 12:00:00
Run Code Online (Sandbox Code Playgroud)

我怎样才能本地化这个日期时间而且最终对象是时区感知的?

如果我除以timezoneoffset-14400000/(3600*1000) = -4(小时)。所以最终的输出应该是:

>>>2014-03-10 08:00:00-04:00
Run Code Online (Sandbox Code Playgroud)

我的尝试:

from pytz import timezone
from dateutil.tz import tzoffset

utc_time = 1394452800000
timezoneoffset = -14400000

tzinfooff = tzoffset(None, timezoneoffset/1000)

print timezone(tzinfooff).localize( datetime.utcfromtimestamp(utc_time/1000) )

>>>Traceback (most recent call last):
  File "/Users/dionysis_lorentzos/Desktop/cmdline copy.py", line 25, in <module>
    print timezone(tzinfo2).localize( datetime.utcfromtimestamp(time/1000) ).isoformat()
  File "/usr/local/lib/python2.7/site-packages/pytz/__init__.py", line 162, in timezone
    if zone.upper() == 'UTC':
AttributeError: 'tzoffset' object has no attribute 'upper'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

你需要使用dateutil.tz.tzoffset()类型; pytz.timezone只需要名称,而不是dateutil.tz对象。

.localize()方法仅适用于pytz-supplied 的时区,因为它们也包含历史偏移量,并且需要datetime使用比.replace()所能做的更多的小心来将它们应用于对象。

如果时间戳是 UTC 中的 UNIX 纪元值,则使用fromtimestap时区作为第二个参数:

>>> print datetime.fromtimestamp(utc_time/1000, tzinfooff)
2014-03-10 08:00:00-04:00
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 UTC 从 UTC 进行翻译datetime.astimezone()

>>> from dateutil.tz impor tzutc
>>> dt_utc = datetime.utcfromtimestamp(utc_time/1000).replace(tzinfo=tzutc())
>>> print dt_utc.astimezone(tzinfooff)
2014-03-10 08:00:00-04:00
Run Code Online (Sandbox Code Playgroud)