如何在格式为“0000-00-00T00:00:00+00:00”的字符串上使用 datetime.strptime?

How can I use datetime.strptime on a string in the format '0000-00-00T00:00:00+00:00'?

由于我的应用程序的情况,我更愿意使用 datetime.strptime 而不是 dateutil.parser

在查看 docs 之后,我认为 %Y-%m-%dT%H:%M:%S%z 可能是解析这样的日期字符串的正确格式。但它仍然给我一个错误。

例子

from datetime import datetime

d = '0000-00-00T00:00:00+00:00'
datetime.strptime(d, '%Y-%m-%dT%H:%M:%S%z')
ValueError: time data '0000-00-00T00:00:00+00:00' does not 
            match format '%Y-%m-%dT%H:%M:%S%z'

我不确定你想用你的代码做什么,但错误不是因为格式错误而是因为 '0000-00-00T00:00:00+00:00' 不是有效时间,因为零不是日期。如果您在其他时间尝试它,例如:'1900-01-01T00:00:00+00:00' 它应该可以正常工作。

处理时区最简单的方法是使用dateutil.parser:

from dateutil.parser import parse
date_obj = parse('1970-01-01T00:00:00+00:00')

date_obj

> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=tzutc())

但是你必须传递一个有效的datetime-value(不仅是零...)

如果你想使用 strptime(),时区的格式必须是 0000 而不是 00:00,所以这个有效:

d = '1900-02-05T11:43:32+0000'
datetime.strptime(d, '%Y-%m-%dT%H:%M:%S%z')

> datetime.datetime(1900, 2, 5, 11, 43, 32, tzinfo=datetime.timezone.utc)

回复很晚,但为了后代,如果你真的想用 strptime 解析它,你可以使用 %z

https://intellipaat.com/community/58366/the-strptime-example-for-datetime-with-tz-offset

示例:

datetime_string = "2021-01-01T10:25:00+00:00"
obj = datetime.strptime(datetime_string, "%Y-%m-%dT%H:%M:%S%z")
print(repr(obj))
>>> datetime.datetime(2021, 1, 1, 10, 25, tzinfo=datetime.timezone.utc)

datetime_string = datetime.strftime(obj, "%Y-%m-%dT%H:%M:%S%z")
print(datetime_string)
>>> 2021-01-01T10:25:00+0000

不过请注意,偏移量现在显示为 +0000,这对您来说可能已经足够了。

如果您仍然坚持输出为 ISO 8601 格式,并坚持使用 strftime 将格式恢复为 +00:00,则必须使用自定义 tzinfo 对象.

示例:

class TZ1(tzinfo):
    def utcoffset(self, dt): return timedelta(hours=0)
    def dst(self, dt):  return timedelta(0)
    def tzname(self, dt): return "+00:00"

datetime_string = "2021-01-01T10:25:00+00:00"
obj = datetime.strptime(datetime_string, "%Y-%m-%dT%H:%M:%S%z").replace(tzinfo=TZ1())
>>> datetime.datetime(2021, 1, 1, 10, 25, tzinfo=<__main__.TZ1 object at 0x7ff6e1c41f50>)

datetime_string = datetime.strftime(obj, "%Y-%m-%dT%H:%M:%S%Z")
print(datetime_string)
>>> 2021-01-01T10:25:00+00:00

此示例显然针对 UTC+0 进行了硬编码,但如有必要,您可以根据 dt 参数应用一些逻辑。

如果您要为来自不可信来源的数据处理中的日期和时间设置严格的规则,以用于验证,这种方法可能非常有用(与 dateutil 库中的魔法相反),强制等,因为您可以设置严格的输入和输出。