將具有短時區名稱的字串解析為時區感知日期時間物件

使用如前例中的 dateutil來解析時區感知時間戳 ,還可以使用指定的時區名稱解析時間戳。

對於使用短時區名稱或縮寫格式化的日期,這些日期通常不明確(例如 CST,可能是中央標準時間,中國標準時間,古巴標準時間等 - 可以在此處找到更多 )或不一定在標準資料庫中可用,有必要指定時區縮寫和 tzinfo 物件之間的對映。

from dateutil import tz
from dateutil.parser import parse

ET = tz.gettz('US/Eastern')
CT = tz.gettz('US/Central')
MT = tz.gettz('US/Mountain')
PT = tz.gettz('US/Pacific')

us_tzinfos = {'CST': CT, 'CDT': CT,
              'EST': ET, 'EDT': ET,
              'MST': MT, 'MDT': MT,
              'PST': PT, 'PDT': PT}

dt_est = parse('2014-01-02 04:00:00 EST', tzinfos=us_tzinfos)
dt_pst = parse('2016-03-11 16:00:00 PST', tzinfos=us_tzinfos)

執行之後:

dt_est
# datetime.datetime(2014, 1, 2, 4, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Eastern'))
dt_pst
# datetime.datetime(2016, 3, 11, 16, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Pacific'))

值得注意的是,如果在此方法中使用 pytz 時區,則無法正確本地化:

from dateutil.parser import parse
import pytz

EST = pytz.timezone('America/New_York')
dt = parse('2014-02-03 09:17:00 EST', tzinfos={'EST': EST})

這只是將 pytz 時區附加到日期時間:

dt.tzinfo # Will be in Local Mean Time!
# <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>

如果使用這種方法,你可能應該在解析後重新定義日期時間的天真部分:

dt_fixed = dt.tzinfo.localize(dt.replace(tzinfo=None))
dt_fixed.tzinfo # Now it's EST.
# <DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)