我有一个UTC时间戳和一个时区偏移时间戳(以毫秒为单位):
utc_time = 1394452800000
timezoneoffset = -14400000
如果我想获得datetime
,我会这样做:
print datetime.utcfromtimestamp(utc_time/1000)
>>>2014-03-10 12:00:00
如何本地化此日期时间,以及最终对象是否可以识别时区?
如果我除timezoneoffset
, - 14400000 /(3600 * 1000)= -4(小时)。所以最终的输出应该是:
>>>2014-03-10 08:00:00-04:00
我的尝试:
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'
答案 0 :(得分:4)
您需要使用 dateutil.tz.tzoffset()
type; pytz.timezone
只接受名称,而不是dateutil.tz
个对象。
.localize()
方法只需要pytz
提供的时区,因为它们也包含历史偏移量,并且需要使用比datetime
对象稍微小一些的方法。只需.replace()
即可。
如果时间戳是UTC的UNIX纪元值,则使用带有时区的fromtimestap
作为第二个参数:
>>> print datetime.fromtimestamp(utc_time/1000, tzinfooff)
2014-03-10 08:00:00-04:00
或者您可以使用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
答案 1 :(得分:1)
要将POSIX时间戳转换为由其utc偏移量指定的时区中的时区感知日期时间对象,您可以创建一个知道的utc datetime对象并将其转换为固定的偏移时区:
from datetime import datetime
utc_dt = datetime.fromtimestamp(utc_time * 1e-3, utc)
dt = utc_dt.astimezone(FixedOffset(timezoneoffset * 1e-3 / 60, None))
print(dt.isoformat(' '))
# -> 2014-03-10 08:00:00-04:00
其中utc
和FixedOffset
在datetime
docs中定义:
from datetime import tzinfo, timedelta
class FixedOffset(tzinfo):
"""Fixed offset in minutes east from UTC."""
def __init__(self, offset, name):
self.__offset = timedelta(minutes = offset)
self.__name = name
def utcoffset(self, dt):
return self.__offset
def tzname(self, dt):
return self.__name
def dst(self, dt):
return timedelta(0)
utc = FixedOffset(0, "UTC")