python2.6.6 将 apache 日志时间戳转换为纪元以来的秒数(unix 样式)
python2.6.6 Convert apache log timestamp to seconds since epoch (unix style)
由于我完全迷失在您在 Whosebug 上找到的数十种时间戳转换方法中,所以我将在这里提出完整的问题:
从 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
提出解决方案
两步:
将时间字符串转换为可感知的日期时间对象(或表示 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。
将感知日期时间对象转换为 "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
由于我完全迷失在您在 Whosebug 上找到的数十种时间戳转换方法中,所以我将在这里提出完整的问题:
从 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
提出解决方案两步:
将时间字符串转换为可感知的日期时间对象(或表示 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。
将感知日期时间对象转换为 "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