2

简单的问题。我有一个格式如下的字符串:

2012-04-30 23:59:01 EDT

我想将其转换为符合 apache 日志的日期格式:

[30/Apr/2012:23:59:01 +0300]

我很确定以下代码(使用datetime)会起作用:

time0 = '2012-04-30 23:59:01 EDT'
time1 = datetime.strptime(time0,'%Y-%m-%d %H:%M:%S %Z')
time2 = datetime.strftime(time1,'[%d/%b/%Y:%H:%M:%S %z]')

但是如果我打印上面的三个变量,time1time2的内容并没有想象中的那么好。更具体地说,EDT似乎没有被正确解析。

time0 = 2012-04-30 23:59:01 EDT
time1 = 2012-04-30 23:59:01
time2 = [30/Apr/2012:23:59:01 ]
4

2 回答 2

4

Python datetime(尤其是strptime)因在时区不好而臭名昭著。您通常需要使用另一个类似pytz或类似的库加载时区信息。

如果可以,请使用python-dateutil进行日期解析。在我看来,这要容易得多,并且内置了所有时区和 DST 内容。

from dateutil import parser
time1 = parser.parse('2012-04-30 23:59:01 EDT', tzinfos={'EDT' : +18000})
datetime.strftime(time1,'[%d/%b/%Y:%H:%M:%S %z]')
于 2013-11-11T19:59:00.883 回答
1

datetime对象可以被描述为“天真”或“有意识”,指的是它们对时区信息的意识。为了使datetime对象具有感知能力,您需要为其提供tzinfo对象。你在这里没有这样做,所以你使用的是 naive datetimes。根据strftime/strptime 上的日期时间文档

对于一个天真的对象,%z 和 %Z 格式代码被空字符串替换。

编辑:进一步查看文档,似乎完全strptime删除了时区信息,因此您必须使用不同的方法,例如dateutil其他地方建议的模块。

于 2013-11-11T20:04:04.500 回答