如何将具有不同时区的字符串转换为日期时间对象?

时间:2011-07-09 19:49:39

标签: python datetime

我理解如何将字符串转换为日期时间对象,但是具有不同时区的字符串呢?例如“10/07/2011 04:22 CEST”

2 个答案:

答案 0 :(得分:4)

EST可能意味着两个不同的时区:欧洲夏令时或东标时间。所以像08/07/2011 04:22 EST这样的日期时间字符串是不明确的 - 没有确定的方法可以正确地将这些字符串转换为时区感知的日期时间。

如果你愿意只是想要一个可能正确的答案,那么 您可以在缩写(如EST和时区名称)之间生成映射,在有效时区中随机选择, 然后使用该时区构建一个时区感知日期时间:

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

答案 1 :(得分:1)

您应该能够在格式字符串中使用带有%Z的strptime,但要注意Python文档中的这个注释(http://docs.python.org/library/datetime.html#strftime-strptime-行为):

“%Z - 如果tzname()返回None,则%Z被空字符串替换。否则%Z将被返回的值替换,该值必须是字符串。支持的完整格式代码集因平台而异,因为Python调用平台C库的strftime()函数,平台变体很常见。“

您可以将时区设置为偏移形式并改为使用%z吗?