ValueError:时间数据'2018-12-22T00:41:30.926932Z'格式'%Y-%m-%d%H:%M:%S'[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我在将时间字符串转换为datetime对象时遇到了麻烦:我知道这个问题已被问过几次,但我无法找到解决问题的方法。

这是我的代码:

order['created'] = 2018-12-22T00:41:30.926932Z
created_at = datetime.datetime.strptime(order['created'],'%m/%d/%Y %H:%M:%S.%f').replace(tzinfo=pytz.utc).astimezone(local_tz)

这是我得到的错误信息

ValueError:时间数据'2018-12-22T00:41:30.926932Z'格式'%m /%d /%Y%H:%M:%S%f'

python datetime strptime
1个回答
2
投票

第一个问题是你有一个这种格式的ISO日期:2018-12-22T00:41:30.926932Z,但你的代码传递给strptime()的格式字符串指定一个美国式的日期,首先是月份和斜杠。

因此,而不是"%m/%d/%Y %H:%M:%S.%f"你需要"%Y-%m-%dT%H:%M:%S.%f"

需要注意的事项:

  1. 年(%Y)排在第一位。
  2. 连字符不斜线。
  3. T在日期和时间之间,而不是空间。

第二个问题是数据以GMT的时区字符串Z结尾,但您的代码不包括格式规范中的那些。适当的格式指令是%z。所以,最后添加%z以获得"%Y-%m-%dT%H:%M:%S.%f%z"

函数strptime()是准确但不明亮的,并且无法解决格式规范与数据不匹配的问题。您得到的只是一条通用消息,表示数据与格式不匹配。此时,您需要返回文档以发现不匹配的位置。

最后,.replace(tzinfo=pytz.utc).astimezone(local_tz)将无法工作,因为(除非你在代码中定义了local_tz,你没有提供),引用local_tz会产生NameError或AttributeError:我怀疑你想要的是tzlocal.get_localzone()。您可能必须安装tzlocal才能工作。 (还有其他方法可以做到这一点,但这种方式最接近您提供的代码。)

解决了这三个问题后,我得到了

>>> order['created'] = "2018-12-22T00:41:30.926932Z"

请注意,您需要围绕时间戳值的引号,这些引号必须在您的原始代码中才会生成您报告的错误消息,但不在您的问题中。始终发布提供错误消息的确切代码,而不是重新输入或编辑的版本。

>>> datetime.datetime.strptime(order['created'],'%Y-%m-%dT%H:%M:%S.%f%z').replace(tzinfo=pytz.utc).astimezone(tzlocal.get_localzone())
datetime.datetime(2018, 12, 22, 1, 41, 30, 926932, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)

这是正确的,但可能与你的结果不符,因为我住在海牙。

在最好的时候使用日期很棘手,而且几乎总是需要对细节的关注程度令人惊讶。

© www.soinside.com 2019 - 2024. All rights reserved.