Python中的日期时间解析时区不一致



当我在Python 3.X 中运行以下程序时

import datetime
DATE_TS_FORMAT = '%Y-%m-%d %H:%M:%S.%f %Z'
date_ts = datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)
date_ts = datetime.datetime.strptime(date_ts, DATE_TS_FORMAT)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)

我得到

2019-01-02 03:04:05.000000 UTC
2019-01-02 03:04:05.000000 

为什么时区信息消失了,我该如何解决这个问题?

确实不一致。。。关键是%Z使strptime接受某些字符串(GMT、UTC和time.tzname-docs中的任何值(,但实际上并没有从中产生任何东西。例如:

from datetime import datetime
s = "2019-01-02 03:04:05.000000 UTC"
dt = datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f %Z')
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5)

生成的datetime对象是幼稚的;再也没有UTC的迹象了。

为了解释这种行为,您可以对datetime对象进行后处理,比如

if "UTC" in s: 
dt = dt.replace(tzinfo=timezone.utc)

(我认为这有点痛苦…(或取代";UTC";%z解析为UTC1的东西,

dt = datetime.strptime(s.replace("UTC", "+00:00"), '%Y-%m-%d %H:%M:%S.%f %z')
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)

(我认为这有点难看…(或使用合适的解析器,例如

from dateutil.parser import parse
dt = parse(s)
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=tzutc())
print(dt.strftime('%Y-%m-%d %H:%M:%S.%f %Z'))
# 2019-01-02 03:04:05.000000 UTC

(如果性能有问题,速度会慢一点…(。


1IMO,这也是不一致的"00:00";也可能是某个时区的UTC偏移量,而该时区恰好具有0小时的UTC偏移。。。

最新更新