1

我很难理解 dateutil.relativedelta 的行为。我知道,如果我使用relativedelta doc中指定的否定参数,则 relativedelta 可能会返回过去的日期。

但是,当我提供正参数时,我希望它总是在未来返回一个日期......这似乎合法吗?

我的用例如下:我们是星期二,现在是 8:35。我想在 6:00 获得最近的星期一和星期二的日期。

这就是我所做的。第一个结果对我来说似乎是正确的,而第二个结果是错误的。

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2016, 11, 29, 8, 35, 23, 786349)

>>> from dateutil import relativedelta
>>> now.weekday()
1

>>> now + relativedelta.relativedelta(weekday=0, hour=6, minute=0) # should give a time in the future
datetime.datetime(2016, 12, 5, 6, 0, 23, 786349)  # here this is correct, in the future

>>> now + relativedelta.relativedelta(weekday=1, hour=6, minute=0) # should give a time in the future
datetime.datetime(2016, 11, 29, 6, 0, 23, 786349)  # but this is in the past / I would expect result (2016, 12, 6, 6, 0, 23, 786349)

那么,我在这里做错了吗?

4

2 回答 2

3

因此,根据您的初始日期,您实际上是在早上 8 点,但您使用hour参数将目标定为早上 6 点,如果您尝试增加一小时,您应该分别使用hoursminutes

>>> now
datetime.datetime(2016, 11, 29, 3, 5, 41, 763818)

>>> now.weekday()
1

>>> now + relativedelta.relativedelta(weekday=1, hour=1)
datetime.datetime(2016, 11, 29, 1, 5, 41, 763818) # Notice how it's in the past

>>> now + relativedelta.relativedelta(weekday=1, hours=1)
datetime.datetime(2016, 11, 29, 4, 5, 41, 763818) # Notice how it's one hour in the future

>>> n + relativedelta.relativedelta(weekday=1, hour=6, minute=0, weeks=1)
datetime.datetime(2016, 12, 6, 6, 0, 41, 763818)
于 2016-11-29T08:08:34.793 回答
2

我认为它在文档中:

开始,关于weekday

这些实例可能会收到一个参数 N,指定第 N 个工作日,它可以是正数或负数(如 MO(+1) 或 MO(-2)。不指定它与指定 +1 相同。

所以通过1,就好像你在通过(1, 1)

然后,在文档的第 7 个点上继续behavior of operations with relativedelta

请注意,如果计算的日期已经是星期一,例如,使用 (0, 1) 或 (0, -1) 不会更改日期。

所以 11 月 29 日已经是星期二,而你要的是星期二。

所以什么都没有改变。

于 2016-11-29T13:11:56.583 回答