二月份的Dateutil解析器无法解析

时间:2014-07-30 19:05:52

标签: python datetime python-dateutil

我在python中遇到一个非常奇怪的错误。

from dateutil import parser
string = "March 2008"
parser.parse(string)
 datetime.datetime(2008, 3, 30, 0, 0)
string = "February 2008"
parser.parse(string)

追踪(最近一次呼叫最后一次):

  

文件“”,第1行,in   文件“/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py”,第697行,解析     return DEFAULTPARSER.parse(timestr,** kwargs)   文件“/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py”,第310行,解析     ret = default.replace(** repl)   ValueError:day超出了月份的范围

我知道我可以在我的字符串中添加一天以使解析器工作,但是我不知道为什么dateutil在没有2月份的情况下不起作用,而它每隔一个月就会工作。

2 个答案:

答案 0 :(得分:4)

这很有趣。

来自dateutil.parser:

    def parse(self, timestr, default=None,
                ignoretz=False, tzinfos=None,
                **kwargs):
    if not default:
        default = datetime.datetime.now().replace(hour=0, minute=0,
                                                  second=0, microsecond=0)

基本上,如果您不提供一天,任何缺少一天的日期字符串将默认为当天。实际情况是今天的第30天,当然是2月没有。这可能被视为dateutil中的错误。

答案 1 :(得分:1)

问题是解析后的字符串中不存在的任何字段都取自当前日期。

请注意,“2008年3月”将于2008年3月30日返回,因为您是在2014年7月30日运行的。

同样,只有“三月”会给你2014年3月30日。

所以,“2008年2月”会给你2008年2月30日,这当然是无效的。