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

3 投票
2 回答
1170 浏览
提问于 2025-04-18 15:23

我在使用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 行, 在 文件 "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py", 第 697 行, 在 parse 返回 DEFAULTPARSER.parse(timestr, **kwargs) 文件 "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py", 第 310 行, 在 parse ret = default.replace(**repl) 值错误:日期超出了月份的范围

我知道我可以在我的字符串中加一天,这样解析器就能正常工作了,但我不明白为什么在没有指定日期的情况下,dateutil在处理二月份时不行,而处理其他月份却没问题。

2 个回答

1

问题在于,任何在解析的字符串中没有出现的字段,都会默认使用当前日期。

比如说,当你输入“2008年3月”时,它返回的是2008年3月30日,因为你是在2014年7月30日运行的这个程序。

同样,如果你只输入“3月”,它会给你2014年3月30日。

所以,如果你输入“2008年2月”,它会返回2008年2月30日,但这显然是无效的,因为2月最多只有29天。

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号,但二月份其实没有30号。这种情况可能算是 dateutil 的一个小问题。

撰写回答