简单的问题。我有一个格式如下的字符串:
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 ]
答案 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
模块。