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

时间:2019-05-29 12:40:28

标签: python datetime strptime

由于我的应用程序的情况,我宁愿使用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'

3 个答案:

答案 0 :(得分:1)

处理时区的最简单方法是使用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)

答案 1 :(得分:0)

我不确定您要如何处理您的代码,但由于格式错误而未给出错误,但由于'0000-00-00T00:00:00+00:00'不是有效时间,因为零不是日期。如果您尝试使用类似'1900-01-01T00:00:00+00:00'的其他时间,它应该可以正常工作。

答案 2 :(得分:0)

回复很晚,但为了后代,如果你真的想用 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 对象。< /p>

示例:

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 库中的魔法相反) . 因为您可以设置刚性输入和输出。