'Saturday, December 22, 2012 1:22:24 PM EST' does not match format '%A, %B %d, %Y %I:%M:%S %p %Z'
也许我失去了一些东西,但任何人都可以发现为什么这不能正确验证?
'Saturday, December 22, 2012 1:22:24 PM EST' does not match format '%A, %B %d, %Y %I:%M:%S %p %Z'
也许我失去了一些东西,但任何人都可以发现为什么这不能正确验证?
您的区域设置时区最有可能为空,例如%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'
您可以为自己省下不少麻烦,并使用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))
的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
以外的时区,请使用diff不同日期解析库。该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()
你做必须虽然提供您的格式你自己的时区偏移。
日期解析器只会为上述情况提供正确的日期时间对象。但请考虑下面的情况,>>> >>> parse('Saturday,13-12-11 1:22:24 PM EST',tzinfos = {'EST':-18000}) datetime.datetime(2011,12,13 ,13,22,24,tzinfo = tzoffset('EST',-18000)) >>> >>> >>> parse('Saturday,09-12-11 1:22:24 PM EST', tzinfos = {'EST':-18000}) datetime.datetime(2011,9,12,13,22,24,tzinfo = tzoffset('EST', - 18000))'。 datetimeobject.date()对于这两种情况都不相同。 – fewtalks
@Pivachandran:这是因为日期*不明确*。没有13个月,所以第一个例子很明显,格式是以日 - 月 - 年的顺序,但第二个可以解释为日 - 月 - 年和月 - 日 - 年。默认是解析日期作为后者,你可以用'dayfirst = True'关键字来改变它。 –
@ Marijn:太好了。谢谢。我不知道这个'dayfirst'关键字。没有这个,我完全糊涂了。 +1为您解释。 – fewtalks
由于@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)
代码的麻烦仍然存在。它忽略了'EST'时区(正确的,因为它可以是美国和澳大利亚:http://www.timeanddate.com/library/abbreviations/timezones/) – eumiro
@ eumiro - 你是对的。我想你可能会在分析时添加'tzinfos' arg来处理它。 – root
很棒,不知道'tzinfos'。 – eumiro