Python 为什么带有正参数的relativedelta返回过去的日期?

Python 为什么带有正参数的relativedelta返回过去的日期?,python,python-dateutil,relativedelta,Python,Python Dateutil,Relativedelta,我很难理解dateutil.relativedelta的行为。 我理解如果我使用中指定的否定参数,relativedelta可能返回过去的日期 然而,当我提供正参数时,我希望它总是在将来返回一个日期。。。这似乎是合法的,对吗 我的用例如下:我们是星期二,时间是8:35。我想知道最近的星期一和星期二6:00的日期 这就是我所做的。第一个结果在我看来是正确的,而第二个结果是错误的 >>> import datetime >>> now = datetime.dat

我很难理解dateutil.relativedelta的行为。 我理解如果我使用中指定的否定参数,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)

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

因此,根据您最初的日期,您实际上是在上午8点,但您使用
hour
参数的目标是早上6点,如果您试图增加一小时,则应分别使用
hours
minutes

>>> 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)

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

>>> 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)

我想是在文件里:

从开始,大约
工作日

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

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

然后,在文档的第7点,继续使用relativedelta操作的行为:

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

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


所以没有什么变化。

我想它在文档中:

从开始,大约
工作日

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

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

然后,在文档的第7点,继续使用relativedelta操作的行为:

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

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


所以没有什么变化。

谢谢你的回答,布莱恩,但结果不是我期望的结果(下周二,又名2016年12月6日)。你在这里做的是在当前时间的基础上“增加”一个小时。但我希望下一个“可用”的周二在给定的时间。使用weeks=1是否能让你达到你想要的目标?
现在+相对德尔塔。相对德尔塔(weekday=1,hours=1,weeks=1)
是的,这修复了我的第一个示例,但破坏了第二个示例(它在将来给出的结果太远).好的,我想我一开始误解了你的意思,因为我在答案中的代码末尾更新了你的答案,一周后你看起来正好是6点。对吗?它适用于第一个示例(工作日=1),但在工作日=0时中断:>>>现在+relativedelta.relativedelta(工作日=0,小时=6,分钟=0,周=1)datetime.datetime(2016,12,12,6,0,23786349)感谢你的回答Bryan,但结果不是我所期望的(下周二,又称2016年12月6日)。你在这里做的是在当前时间上“增加”一个小时。但我希望下一个“可用”的周二在给定的时间。使用weeks=1是否能让你到达你想要的地方?
now+relativedelta.relativedelta(weekday=1,hours=1,weeks=1)
是的,这修复了我的第一个示例,但破坏了第二个示例(它在将来给出的结果太远).好的,我想我一开始误解了你的意思,因为我在答案中的代码末尾更新了你的答案,一周后你看起来正好是6点。对吗?它适用于第一个示例(工作日=1),但在工作日=0时中断:>>>现在+relativedelta.relativedelta(工作日=0,小时=6,分钟=0,周=1)datetime.datetime(2016, 12, 12, 6, 0, 23, 786349)你是对的,第七点解释了这一切。这是设计的行为。感谢你的输入解释了一切。它在文档中,我错过了它。事实上,你的答案更有意义,并且回答了我标题中的问题。所以我最后将它标记为已接受的答案,尽管我使用了@Bryan answer的技巧。你是对的没错,第七点解释了一切。这是设计的行为。感谢你的输入,解释了一切。它在文档中,我错过了它。事实上,你的答案更有意义,并且回答了我标题中的问题。所以我将它标记为可接受的答案。最后,我使用了@Bryan answer的技巧。