[英]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.