python2.6.6将apache日志时间戳转换为epoch以来的秒数(unix样式)

时间:2015-09-03 08:50:22

标签: python apache datetime python-2.6 epoch

由于我在stackoverflow上发现的时间戳转换的几十种方式完全迷失了,所以我会在这里问完整的问题:

从apache日志(在CEST时区中)转换此时间戳:

30/Aug/2015:05:13:53 +0200

进入这个:

1440904433

使用

$ python --version
Python 2.6.6

验证

$ date --date @1440904433
Sun Aug 30 05:13:53 CEST 2015
$ date -u --date @1440904433
Sun Aug 30 03:13:53 UTC 2015

结果不好:

1440911633
1440908033

我目前的代码一直持续到这里:

>>> from dateutil import parser
>>> parser.parse("30/Aug/2015:05:13:53 +0200".replace(':',' ',1))
datetime.datetime(2015, 8, 30, 5, 13, 53, tzinfo=tzoffset(None, 7200))

请不要提出pytz模块,我没有它,我无法安装它。 请不要为python3提出解决方案

1 个答案:

答案 0 :(得分:4)

两个步骤:

  1. 将时间字符串转换为有意识的日期时间对象(或表示UTC时间的天真datetime对象)。

    >>> from dateutil import parser
    >>> parser.parse("30/Aug/2015:05:13:53 +0200".replace(':', ' ', 1))
    datetime.datetime(2015, 8, 30, 5, 13, 53, tzinfo=tzoffset(None, 7200))
    

    你已经做到了。请参阅How to parse dates with -0400 timezone string in python?,了解如何仅使用stdlib。

  2. 将知晓的日期时间对象转换为"seconds since the Epoch"

    >>> from datetime import datetime
    >>> from dateutil import tz
    >>> td = d - datetime(1970, 1, 1, tzinfo=tz.tzutc())
    >>> td
    datetime.timedelta(16677, 11633)
    >>> (td.microseconds + (td.seconds + td.days * 86400) * 10**6) // 10**6
    1440904433
    

    使用/并启用from __future__ import division,即可得到一小段时间。如果你不需要支持分数;你可以简化公式:

    >>> td.seconds + td.days * 86400
    1440904433
    

    如果你只使用stdlib获得第一步的时间,那么你在这里不需要dateutil.tz。请参阅Converting datetime.date to UTC timestamp in Python

  3. 这是针对来自搜索引擎的访问者的Python 3解决方案:

    >>> from datetime import datetime
    >>> d = datetime.strptime("30/Aug/2015:05:13:53 +0200", "%d/%b/%Y:%H:%M:%S %z")
    >>> d.timestamp()
    1440904433.0