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

2024-03-28 23:55:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道如何将字符串转换为datetime对象,但是对于具有不同时区的字符串呢?例如“10/07/2011 04:22 CEST”


Tags: 对象字符串datetimecest
2条回答

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

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

你能把时区换成偏移形式,用%z代替吗?在

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

相关问题 更多 >