Python日期字符串为类似apache的日期格式

时间:2013-11-11 19:50:29

标签: python datetime

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

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]')

但是,如果我打印上面的三个变量, time1 time2 的内容不符合预期。更具体地说, EDT 似乎没有被正确解析。

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

2 个答案:

答案 0 :(得分: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]')

答案 1 :(得分:1)

datetime个对象可以被描述为“天真”或“意识到”,指的是他们对时区信息的意识。为了使datetime对象可识别,您需要为其提供tzinfo对象。你在这里没有这样做,所以你正在使用幼稚的datetime。根据{{​​3}}:

  

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

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