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