与日期时间和相对时间差的奇怪算术

1 投票
1 回答
1380 浏览
提问于 2025-04-18 07:48

relativedelta对象相乘安全吗?我发现了一些奇怪和不一致的行为,但找不到这个类支持哪些算术运算的相关文档(如果有的话)。

>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta
>>> datetime.now() + relativedelta(days=2)
datetime.datetime(2014, 5, 30, 12, 24, 59, 173941)
>>> datetime.now() + relativedelta(days=1) * 2
# TypeError: integer argument expected, got float

另一方面:

>>> relativedelta(days=2) == relativedelta(days=1) * 2
True

完整的错误追踪信息(使用python 2.7.5和dateutil 1.5):

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/dateutil/relativedelta.py", line 261, in __radd__
    day = min(calendar.monthrange(year, month)[1],
  File "/usr/lib/python2.7/calendar.py", line 121, in monthrange
    day1 = weekday(year, month, 1)
  File "/usr/lib/python2.7/calendar.py", line 113, in weekday
    return datetime.date(year, month, day).weekday()
TypeError: integer argument expected, got float

1 个回答

4

你遇到了一个关于 relativedelta 处理乘法的已知错误,这个问题已经修复了。这个错误只影响 Python 2.7 及更新版本(某些函数的调用方式变得更严格了)。

请把你的 python-dateutils 包升级到 2.1 或更高版本。

不要被项目文档中关于 2.0 只能在 Python 3 上使用的错误信息吓到;实际上,2.1 和 2.2 版本是可以在 Python 2 和 3 上兼容使用的。

撰写回答