python2.6.6 将 apache 日志时间戳转换为自纪元以来的秒数(unix 风格)

Gun*_*ick 4 python apache datetime epoch python-2.6

因为我完全迷失在你在 stackoverflow 上找到的几十种时间戳转换方法,所以我会在这里问完整的问题:

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

30/Aug/2015:05:13:53 +0200
Run Code Online (Sandbox Code Playgroud)

进入这个:

1440904433
Run Code Online (Sandbox Code Playgroud)

使用

$ python --version
Python 2.6.6
Run Code Online (Sandbox Code Playgroud)

确认:

$ date --date @1440904433
Sun Aug 30 05:13:53 CEST 2015
$ date -u --date @1440904433
Sun Aug 30 03:13:53 UTC 2015
Run Code Online (Sandbox Code Playgroud)

不好的结果是:

1440911633
1440908033
Run Code Online (Sandbox Code Playgroud)

我当前的代码到这里为止:

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

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

jfs*_*jfs 5

两个步骤:

  1. 将时间字符串转换为可感知的日期时间对象(或datetime表示 UTC 时间的原始对象)。

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

    你已经做到了。请参阅如何在 python 中使用 -0400 时区字符串解析日期?关于如何只使用 stdlib 来做到这一点。

  2. 将有意识的日期时间对象转换为“自纪元以来的秒数”

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

    使用/并启用 from __future__ import division, 以获得几分之一秒。如果你不需要支持分数;你可以简化公式:

    >>> td.seconds + td.days * 86400
    1440904433
    
    Run Code Online (Sandbox Code Playgroud)

    如果您只使用 stdlib 在第一步获得 utc 时间,那么您就不需要dateutil.tz这里了。请参阅在 Python 中将 datetime.date 转换为 UTC 时间戳

这是针对来自搜索引擎的访问者的 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
Run Code Online (Sandbox Code Playgroud)