【发布时间】:2020-10-23 19:40:21
【问题描述】:
我正在尝试将time-objects 序列化为 ISO8601 格式,同时使用 Python 3.8 保留它们的时区信息。
documentation for time.isoformat 声明:
time.isoformat(timespec='auto')返回一个以 ISO 8601 格式表示时间的字符串,其中之一:
HH:MM:SS.ffffff,如果microsecond不为0HH:MM:SS,如果microsecond为 0HH:MM:SS.ffffff+HH:MM[:SS[.ffffff]],如果utcoffset()不返回NoneHH:MM:SS+HH:MM[:SS[.ffffff]],如果microsecond为 0 且utcoffset()不返回None
据我从该文档中了解到的,我只需要生成一个utcoffset() 不是None 的time-object,即可将时区信息作为ISO8601 格式字符串的一部分。使用datetime.timezone.utc 作为时区时效果很好:
>>> from datetime import time, timezone
>>> t = time(1, 2, 3, tzinfo=timezone.utc)
>>> t
datetime.time(1, 2, 3, tzinfo=datetime.timezone.utc)
>>> t.utcoffset()
datetime.timedelta(0)
>>> t.isoformat()
'01:02:03+00:00'
但是,一旦我想使用 Python 标准库未提供的时区,这似乎不再适用。我尝试了dateutil 和pytz,在这两种情况下都得到了相同的结果:
>>> from datetime import time
>>> from dateutil.tz import gettz
>>> t = time(1, 2, 3, tzinfo=gettz("US/Eastern"))
>>> t
datetime.time(1, 2, 3, tzinfo=tzfile('/usr/share/zoneinfo/US/Eastern'))
>>> t.utcoffset()
>>> t.isoformat()
'01:02:03'
>>> from datetime import time
>>> from pytz import timezone
>>> t = time(1, 2, 3, tzinfo=timezone("US/Eastern"))
>>> t
datetime.time(1, 2, 3, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)
>>> t.utcoffset()
>>> t.isoformat()
'01:02:03'
我也尝试改用time.strftime(),但这也不能解决我的问题:
>>> from datetime import time
>>> from dateutil.tz import gettz
>>> t = time(1, 2, 3, tzinfo=gettz("US/Eastern"))
>>> t.strftime("%H:%M:%S%z")
'01:02:03'
为什么会这样?我该如何解决这个问题?
【问题讨论】: