带有 tz 偏移量的日期时间的 strptime 示例

strptime example for datetime with tz offset

我有日期时间字符串 2020-10-23T11:50:19+00:00。我可以在没有时区的情况下将其解析为:

>>> datetime.strptime('2020-10-23T11:50:19', '%Y-%m-%dT%H:%M:%S')
datetime.datetime(2020, 10, 23, 11, 50, 19)

但是我在使用 00:00 版本的时区解析它时遇到了问题。这样做的正确方法是什么?

>>> datetime.strptime('2020-10-23T11:50:19+00:00', '%Y-%m-%dT%H:%M:%S+???')

dateutil.parser 函数将解析该时区格式:

from dateutil.parser import parse

dt = parse('2020-10-23T11:50:19+00:00')
print(dt.date())
print(dt.time())
print(dt.tzinfo)

结果:

2020-10-23
11:50:19
tzutc()

您可以将单独的 datetimetzinfo 对象组合成一个 datetime,如果您需要的话,如下所示:

dt = datetime.combine(dt.date(), dt.time(), tzinfo=dt.tzinfo)
print(dt)

结果:

2020-10-23 11:50:19+00:00

您正在寻找 %z:

>>> datetime.strptime('2020-10-23T11:50:19+00:00', '%Y-%m-%dT%H:%M:%S%z')
datetime.datetime(2020, 10, 23, 11, 50, 19, tzinfo=datetime.timezone.utc)

注意一些 Python 版本兼容性说明:

Changed in version 3.7: When the %z directive is provided to the strptime() method, the UTC offsets can have a colon as a separator between hours, minutes and seconds. For example, '+01:00:00' will be parsed as an offset of one hour. In addition, providing 'Z' is identical to '+00:00'.

更稳健的方法,它不是 strptime,但自 Python 3.7:

以来它仍在 stdlib 中
>>> datetime.fromisoformat('2020-10-23T11:50:19+00:00')
datetime.datetime(2020, 10, 23, 11, 50, 19, tzinfo=datetime.timezone.utc)

作为 documented 此函数支持以下格式的字符串:

YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]

其中 * 可以匹配任何单个字符(不仅仅是 T)。