我希望'以这种格式解析日期,但忽略字符串的部分内容。 '星期三,1770年10月27日22:17:00 GMT'从我收集的信息来看,datetime不能很好地支持时区。哪个好,我真的只想忽略字符串的时区部分,而不必对其进行字符串操作。有什么我可以用下面替换%Z来说“这里有任何字符串”并解析日期吗?另外,我不明白为什么它会解析PST,GMT等时区而不是EST。在任何情况下它似乎都不附加tzinfo,不确定它真正寻找%Z部分的字符串类型。
>>> import datetime
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z')
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 PST', '%a, %d %b %Y %H:%M:%S %Z')
>>> y = datetime.datetime.strptime('Wed, 27 Oct 1770 22:17:00 EST', '%a, %d %b %Y %H:%M:%S %Z')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/brazil-pkg-cache/packages/Python/Python-2.5.1.17.1/RHEL5_64/DEV.STD.PTHREAD/build/lib/python2.5/_strptime.py", line 331, in strptime
(data_string, format))
ValueError: time data did not match format: data=Wed, 27 Oct 1770 22:17:00 EST fmt=%a, %d %b %Y %H:%M:%S %Z
注意:dateutil对我来说不是一个选项,我想支持多种格式,不能让dateutil意外地解释日期错误。 (例如,当看到日期如01/02/2010,2月1日或1月2日时,dateutil似乎会猜测)。我基本上只想尝试接受我在订单中指定的格式,直到我得到一个匹配。
答案 0 :(得分:3)
您是否真的查看了dateutil的文档?
dateutil.parser.parse()
确实有let you control格式为guesser的优先级,并且它还有一个ignoretz=True
参数。
如果这还不够,可能会覆盖一些类来实现自己的优先规则。
当然,如果没有,您可能不得不求助于字符串解析,因为Python的strptime()实现调用底层C实现来解析时区名称。 (我不知道为什么它不是为你理解EST,但它可能是系统范围的,在某些系统上不是问题)
答案 1 :(得分:3)
val = str.join(' ', 'Wed, 17 Oct 2011 22:22:22 +0300'.split(None)[1:7])
val = datetime.datetime.strptime(val, '%d %b %Y %H:%M:%S')
答案 2 :(得分:2)
我认为没有字符串操作可以完全做到这一点,但也许这是一个选择。看看时间并尝试这样的事情:
datetime(*(time.strptime('Wed, 27 Oct 1770 22:17:00 GMT', '%a, %d %b %Y %H:%M:%S %Z')[0:5]))
答案 3 :(得分:0)
在strptime()中似乎没有办法做到这一点。我知道你说你不想做字符串操作,但你可能没有选择。您可以在首次从输入中搜索日期/时间字符串时执行数据清理,也可以创建mystrptime()
并仅在异常中执行操作。以下代码不正确,因为它不处理字符串中任何位置出现的%Z的一般情况,但您明白了。
import re, datetime
def mystrptime(time_str, format):
try:
return datetime.datetime.strptime(time_str, format)
except ValueError:
if not '%Z' in format:
raise # it must have been something else
new_time_str = re.sub(r'\s*\w+\s*$', '', time_str)
new_format = re.sub(r'\s*%Z\s*$', '', format)
return datetime.datetime.strptime(new_time_str, new_format)