将具有短时区名称的字符串解析为时区感知日期时间对象
使用如前例中的 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>)