首页 > 解决方案 > 如何在分号后没有指定秒数的 Z 字母解析日期时间

问题描述

我正在解析该程序的日志,但未访问该程序的源代码。

日志在日志记录中包含一个有趣的事件时间戳 - 2018-11-02T06:25:03870000Z。这对我来说看起来很奇怪,我不知道它有多正确。但我倾向于认为03974200Z描述了一个 seconds ( %s) 部分,我想尽可能多地从这个记录中收集信息。

我正在尝试从 Python 3.7 解析这个示例,如下所示:

d = '2018-11-02T06:25:03870000Z'
dt.datetime.strptime(d, '%Y-%m-%dT%H:%M:%S')

它会产生一个可预测的错误:

Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py", line 577, in _strptime_datetime
tt, fraction, gmtoff_fraction = _strptime(data_string, format)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/_strptime.py", line 362, in _strptime
data_string[found.end():])
ValueError: unconverted data remains: 870000Z

更新:我对此有肮脏的解决方案,但如果有比这更好的方法来做这样的操作:

sc = d.split(':')[-1][:2]
dd = d.split(':')
en = ':'.join(dd[:-1]) 
en += ':' + sc
>> en
'2018-11-02T06:25:03'

问题:

  1. 如何正确解析这样的日期时间(03在示例中确定为秒的一部分)?
  2. (可选) Idk。但是日志中的这个日期时间示例是否正确(就 ISO 或其他方面而言)?

标签: pythondatetime

解决方案


Z 指定祖鲁时区(UTC 或 GMT),秒数以整秒 (03) 后跟微秒 (870000) 的形式给出,因此您可以使用以下方法完全解析日期:

d = '2018-11-02T06:25:03870000Z'
dt.datetime.strptime(d, '%Y-%m-%dT%H:%M:%S%fZ')

推荐阅读