将具有短时区名称的字符串解析为时区感知日期时间对象

使用如前例中的 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>)