'Saturday, December 22, 2012 1:22:24 PM EST' does not match format '%A, %B %d, %Y %I:%M:%S %p %Z'
也许我错过了一些东西,但有人能说出为什么这不能正确验证吗?
答案 0 :(得分:2)
strptime()
函数无法很好地处理%Z
时区解析。实际上只支持UTC和GMT,以及time.tzname
的当前值。请参阅strptime
documenation:
对
%Z
指令的支持基于tzname
中包含的值以及daylight
是否为真。因此,它是特定于平台的,除了识别始终已知的UTC和GMT(并且被认为是非夏令时时区)。
删除输入的EST
部分和格式字符串的%Z
部分可以解决问题:
>>> import time
>>> time.strptime('Saturday, December 22, 2012 1:22:24 PM EST', '%A, %B %d, %Y %I:%M:%S %p %Z')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/_strptime.py", line 454, in _strptime_time
return _strptime(data_string, format)[0]
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/_strptime.py", line 325, in _strptime
(data_string, format))
ValueError: time data 'Saturday, December 22, 2012 1:22:24 PM EST' does not match format '%A, %B %d, %Y %I:%M:%S %p %Z'
>>> time.strptime('Saturday, December 22, 2012 1:22:24 PM', '%A, %B %d, %Y %I:%M:%S %p')
time.struct_time(tm_year=2012, tm_mon=12, tm_mday=22, tm_hour=13, tm_min=22, tm_sec=24, tm_wday=5, tm_yday=357, tm_isdst=-1)
或用EST
替换时区GMT
:
>>> time.strptime('Saturday, December 22, 2012 1:22:24 PM GMT', '%A, %B %d, %Y %I:%M:%S %p %Z')
time.struct_time(tm_year=2012, tm_mon=12, tm_mday=22, tm_hour=13, tm_min=22, tm_sec=24, tm_wday=5, tm_yday=357, tm_isdst=0)
要使用time.tzname
,GMT
或UTC
以外的时区解析字符串,请使用其他日期解析库。 dateutil
library有一个很好的parse
function可以正确处理时区:
>>> from dateutil.parser import parse
>>> parse('Saturday, December 22, 2012 1:22:24 PM EST', tzinfos={'EST': -18000})
datetime.datetime(2012, 12, 22, 13, 22, 24, tzinfo=tzoffset(u'EST', -18000))
使用dateutil.parser.parse()
时, 必须为您的格式提供自己的时区偏移量。
答案 1 :(得分:1)
您可以省去很多麻烦并使用dateutil。
In [1]: from dateutil import parser
In [2]: parser.parse('Saturday, December 22, 2012 1:22:24 PM EST')
Out[2]: datetime.datetime(2012, 12, 22, 13, 22, 24)
至于eumiro指出的歧义,你可以添加一个tzinfo
参数:
In [3]: parser.parse('Saturday, December 22, 2012 1:22:24 PM EST',tzinfos={'EST':-5*3600})
Out[3]: datetime.datetime(2012, 12, 22, 13, 22, 24, tzinfo=tzoffset('EST', -18000))
答案 2 :(得分:1)
正如@root建议的那样,dateutil.parser是解析日期的有力方法,但只是为了澄清这里的问题
我刚看到_strptime.py中的代码,似乎支持的时区是
["utc", "gmt", time.tzname[0].lower()]
如果当前的语言环境时区支持夏令时,它会附加
time.tzname[0].lower()
到上面的列表。
因此,在使用strptime时,请确保解析日期的时区支持源时区
以下是参考代码
def __calc_timezone(self):
# Set self.timezone by using time.tzname.
# Do not worry about possibility of time.tzname[0] == timetzname[1]
# and time.daylight; handle that in strptime .
try:
time.tzset()
except AttributeError:
pass
no_saving = frozenset(["utc", "gmt", time.tzname[0].lower()])
if time.daylight:
has_saving = frozenset([time.tzname[1].lower()])
else:
has_saving = frozenset()
self.timezone = (no_saving, has_saving)
答案 3 :(得分:0)
您的区域设置时区很可能是空的,例如%Z
评估为''
您可以通过以下方式测试:
>>> fmt = '%A, %B %d, %Y %I:%M:%S %p %Z'
>>> datetime.strptime(datetime.strftime(datetime.now(), fmt), fmt)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/_strptime.py", line 325, in _strptime
(data_string, format))
ValueError: time data 'Friday, December 28, 2012 11:34:35 AM ' does not match format '%A, %B %d, %Y %I:%M:%S %p %Z'