繁体   English   中英

从时区偏移量本地化日期时间(可识别时区)

[英]Localize datetime (timezone aware) from timezone offset

我有一个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'

您需要使用只是 dateutil.tz.tzoffset() ; pytz.timezone仅接受名称 ,而不dateutil.tz对象。

仅在pytz提供的时区中才需要.localize()方法,因为它们也包含历史偏移量,并且需要将它们应用于datetime对象,这要比.replace()稍加注意。

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

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

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

>>> 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

要将POSIX时间戳转换为由utc偏移指定的时区中的时区识别日期时间对象,可以创建一个感知的utc日期时间对象并将其转换为固定偏移时区:

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

其中utcFixedOffsetdatetime 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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM