繁体   English   中英

如何在格式为“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

查看文档后,我认为%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'

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

但是你必须传递一个有效的日期时间值(不仅仅是零......)

如果你想使用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库中的魔法相反),因为您可以设置严格的输入和输出。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM