ValueError: time data '2018-12-22T00:41:30.926932Z' does not match format '%Y-%m-%d %H:%M:%S'

ValueError: time data '2018-12-22T00:41:30.926932Z' does not match format '%Y-%m-%d %H:%M:%S'

我在将时间字符串转换为日期时间对象时遇到问题: 我知道这个问题已经被问过几次了,但我一直没能找到解决问题的方法。

这是我的代码:

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: time data '2018-12-22T00:41:30.926932Z' does not match format '%m/%d/%Y %H:%M:%S.%f'

第一个问题是您有一个采用这种格式的 ISO 日期:2018-12-22T00:41:30.926932Z 但是您的代码传递给 strptime() 的格式字符串指定了一个美式日期,其中月份在前并且有斜杠。

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

注意事项:

  1. 年份 (%Y) 在前。
  2. 连字符不是斜杠。
  3. T 在日期和时间之间,而不是 space。

第二个问题是数据以格林威治标准时间的时区字符串 Z 结尾,但您的代码未将其包含在格式规范中。正确的格式指令是 %z。所以,在末尾添加 %z 得到 "%Y-%m-%dT%H:%M:%S.%f%z".

函数strptime()准确但不明亮,无法计算出您的格式规范与数据不匹配的地方。您得到的只是一条通用消息,内容为 data does not match format。届时,您需要返回文档以发现不匹配的地方。

最后,.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"

注意,您需要在时间戳值周围加上引号,它必须在您的原始代码中才能导致您报告的错误消息,但不在您的问题中。始终 post 给出错误消息的 确切代码 ,而不是重新输入或编辑的版本。

>>> 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>)

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

即使在最好的情况下,处理日期也很棘手,而且几乎总是需要对细节的关注程度令人惊讶。