如何用分号后没有指定秒数的Z字母解析日期时间

时间:2018-11-02 15:15:54

标签: python datetime

我正在解析该程序的日志,而无法访问该程序的源代码。

日志在日志记录中包含有趣的事件时间戳– 2018-11-02T06:25:03870000Z。在我看来,这很奇怪,我不知道它的正确性。但是我倾向于认为03974200Z描述了秒(%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或其他方面而言)?

2 个答案:

答案 0 :(得分:1)

Z指定Zulu时区(UTC或GMT),秒以整秒(03)表示,后跟微秒(870000),因此您可以使用以下方法完全解析日期:

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

答案 1 :(得分:-1)

我会用

import re
d = '2018-11-02T06:25:03870000Z'
date = re.findall('\d+', d)

这将为您提供连续出现一个或多个数字的所有事件的列表,现在您可以根据需要进行操作,例如

print("Y: %s, M: %s, D: %s, H: %s, m: %s, S: %s" %(tuple(date)))

当然,您还可以四舍五入以使它们只有两位数字