繁体   English   中英

将日期,时间和区域解析为UTC日期时间对象

[英]Parsing date, time and zone to UTC datetime object

作为日志记录系统的一部分,我想解析来自Cisco设备的字符串时间戳,其格式如下:

# show clock
16:26:19.990 GMT+1 Wed Sep 11 2013

解析结果应为UTC datetime实例,该实例将存储在SQLite数据库中,因此需要进行时区转换。

仅使用datetime.strptime是不够的,因为%Z指令仅识别本地时区(即与当前$LANG$LC_*环境相关的时区)。 因此,我需要使用pytz包。

由于格式始终相同,因此我可以执行以下操作:

import pytz
from datetime import datetime

s = '16:26:19.990 CEST Wed Sep 11 2013'
tm, tz, dt = s.split(" ", 2)
naive = datetime.strptime("%s %s" % (tm, dt), "%H:%M:%S.%f %a %b %d %Y")
aware = naive.replace(timezone=pytz.timezone(tz))
universal = aware.astimezone(pytz.UTC)

但是,如果不进行一些修改,这将不起作用。 tz的值必须更正为pytz可以识别的名称。 在此示例中, pytz.timezone('CEST')引发UnknownTimezoneError因为实际时区为CET 问题在于,夏令时校正不适用:

>>> from datetime import datetime
>>> from pytz import UTC, timezone
>>> a = datetime.strptime('16:18:57.925 Wed Sep 11 2013', '%H:%M:%S.%f %a %b %d %Y')
>>> b = a.replace(tzinfo=timezone('CET'))
>>> a
datetime.datetime(2013, 9, 11, 16, 18, 57, 925000)
>>> b
datetime.datetime(2013, 9, 11, 16, 18, 57, 925000, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)
>>> b.astimezone(UTC)
datetime.datetime(2013, 9, 11, 15, 18, 57, 925000, tzinfo=<UTC>)

使用normalize似乎无济于事:

>>> timezone('CET').normalize(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/etanol/virtualenvs/plexus/local/lib/python2.7/site-packages/pytz/tzinfo.py", line 235, in normalize
    raise ValueError('Naive time - no tzinfo set')
ValueError: Naive time - no tzinfo set
>>> timezone('CET').normalize(b)
datetime.datetime(2013, 9, 11, 17, 18, 57, 925000, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>)

我真的不知道我在想什么,但是想要的结果是:

datetime.datetime(2013, 9, 11, 14, 18, 57, 925000, tzinfo=<UTC>)

提前致谢。

使用timezone.localize

>>> from datetime import datetime
>>> from pytz import UTC, timezone
>>>
>>> CET = timezone('CET')
>>>
>>> a = datetime.strptime('16:18:57.925 Wed Sep 11 2013', '%H:%M:%S.%f %a %b %d %Y')
>>> print CET.localize(a).astimezone(UTC)
2013-09-11 14:18:57.925000+00:00

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM