datetime:从时区名称的字符串转换不起作用

时间:2017-02-02 10:37:23

标签: python python-3.x timezone python-datetime

我有以下字符串"2017-03-30 08:25:00CET",我想将其转换为日期时间tz感知对象。

根据this SO question,从python 3.2可以仅使用datetime模块完成。另外,从documentation开始,我看到了

%z |  UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). |  (empty), +0000, -0400, +1030
%Z |  Time zone name (empty string if the object is naive).                        |  (empty), UTC, EST, CST

所以我尝试以下

datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%Z')

我没有收到任何错误,但是我得到的对象不是tz-aware

datetime.datetime(2017, 3, 30, 8, 25)

另一方面,如果我将我的字符串转换为"2017-03-30 08:25:00+0200",然后将其转换为带有

的对象

datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%z')

我确实得到了tz感知的日期时间:

datetime.datetime(2017, 3, 30, 8, 25, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

为什么它适用于%z但不适用于%Z的任何想法?我做错了什么?

1 个答案:

答案 0 :(得分:4)

根据tzinfo提供的信息判断,%Z不像您在"UTC"这样的字符串中提供的方式一样,并且会返回具有正确时区的日期时间实例。

pytz为您的问题提供了可能的解决方案。但是,文档说,没有保证您的时区将被日期时间识别,并建议尽可能长时间使用UTC。

使用pytz的解决方案:

from datetime import datetime
from pytz import timezone
dep_dt = '2017-03-30 08:25:00CET'
dt = datetime.strptime(dep_dt, '%Y-%m-%d %H:%M:%S%Z')
timezone(dep_dt[19:]).localize(dt)

输出:

datetime.datetime(2017, 3, 30, 8, 25, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>)