我知道如何将字符串转换为datetime对象,但是具有不同时区的字符串怎么办?例如"10/07/2011 04:22 CEST"
EST可以表示两个不同的时区:欧洲夏令时或东部标准时间。因此,像08/07/2011 04:22 EST
这样的日期时间字符串是有歧义的——没有确定的方法可以正确地将这些字符串转换为具有时区意识的日期时间。
如果你愿意试着找出一个可能正确的答案,那么您可以在缩写(如EST
)和时区名称之间生成映射,在有效时区中随机选择,以及然后使用该时区构建一个支持时区的datetime:
import dateutil.tz as dtz
import pytz
import datetime as dt
import collections
import random
timezones = collections.defaultdict(list)
for name in pytz.common_timezones:
timezone = dtz.gettz(name)
try:
now = dt.datetime.now(timezone)
except ValueError:
# dt.datetime.now(dtz.gettz('Pacific/Apia')) raises ValueError
continue
abbrev = now.strftime('%Z')
timezones[abbrev].append(name)
date_string, tz_string = '10/07/2011 04:22 CEST'.rsplit(' ', 1)
date = dt.datetime.strptime(date_string, '%m/%d/%Y %H:%M')
print(date)
# 2011-10-07 04:22:00
tz = pytz.timezone(random.choice(timezones[tz_string]))
print(tz)
# Europe/Oslo
date = tz.localize(date)
print(date)
# 2011-10-07 04:22:00+02:00
您应该能够在格式字符串中使用带有%Z的strptime,但请注意Python文档(http://docs.python.org/library/datetime.html#strftime-strptime-behavior):
)中的此注意"%Z——如果tzname()返回None, %Z将被一个空字符串替换。否则,%Z将被返回值替换,该返回值必须是字符串。支持的完整格式代码集因平台而异,因为Python调用平台C库的strftime()函数,并且平台差异很常见。"
您可以将时区设置为偏移量形式并使用%z代替吗?