【问题标题】:python2.6.6 Convert apache log timestamp to seconds since epoch (unix style)python2.6.6将apache日志时间戳转换为纪元以来的秒数(unix风格)
【发布时间】:2015-11-29 00:25:48
【问题描述】:

由于我完全迷失在你在 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提出解决方案

【问题讨论】:

    标签: python apache datetime python-2.6 epoch


    【解决方案1】:

    两步:

    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 获得 utc 时间,则此处不需要dateutil.tz。见Converting datetime.date to UTC timestamp in Python

    以下是针对来自搜索引擎的访问者的 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
    

    【讨论】:

    • 这就是我需要的。很好,在 python3 中,这变得不那么复杂了。您错过了 d=parser.parse("30/Aug/2015:05:13:53 +0200".replace(':',' ',1)) 以便能够剪切粘贴您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-01-25
    • 2013-08-19
    • 2018-08-03
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多