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

Dav*_*rez 1 python datetime strptime

我在将时间字符串转换为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)
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息

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

Boa*_*les 5

第一个问题是您使用这种格式的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 在日期和时间之间,而不是空格之间。

第二个问题是,数据Z以GMT 的时区字符串结尾,但是您的代码未在格式规范中包含该字符串。正确的格式指令是%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"
Run Code Online (Sandbox Code Playgroud)

请注意,您需要在时间戳记值前后加上引号,该引号必须已包含在原始代码中才能生成您报告的错误消息,但不在您的问题中。始终张贴给出错误消息的确切代码,而不是重新输入或编辑的版本。

>>> 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>)
Run Code Online (Sandbox Code Playgroud)

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

在大多数情况下,使用日期进行操作是很棘手的,几乎总是需要对细节的关注程度令人惊讶。