【问题标题】:Why does relativedelta with positive arguments return a date in the past?为什么带有正参数的 relativedelta 返回过去的日期?
【发布时间】:2017-04-13 03:09:43
【问题描述】:

我很难理解 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)

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

【问题讨论】:

    标签: python python-dateutil relativedelta


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答 Bryan,但结果不是我所期望的(下周二,也就是 2016 年 12 月 6 日)。您在这里所做的是在当前时间上“增加”一小时。但我希望在给定时间的下一个星期二“有空”。
    • 使用weeks=1 能否将您带到您要寻找的地方? now + relativedelta.relativedelta(weekday=1, hours=1, weeks=1)
    • 是的,这修复了我的第一个示例,但破坏了第二个示例(它给出的结果在未来太远了)。
    • 好的,所以我想我一开始就误解了你,你希望从现在开始一周后正好是 6 点,因为我在答案中的代码末尾进行了更新.对吗?
    • 它适用于第一个示例(工作日=1)但在工作日=0 中断:>>> now + relativedelta.relativedelta(weekday=0, hour=6, minute=0, week=1 ) datetime.datetime(2016, 12, 12, 6, 0, 23, 786349)
    【解决方案2】:

    我认为它在文档中:

    开头,关于weekday:

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

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

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

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

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

    所以没有任何变化。

    【讨论】:

    • 你说得对,第七点说明了一切。这是设计行为。感谢您提供的解释一切的输入。它在文档中,我错过了。
    • 实际上,您的回答更有意义,并回答了我标题中的问题。因此,我最终将其标记为已接受的答案,尽管我正在使用@Bryan 答案中的技巧。
    猜你喜欢
    • 2022-09-26
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2020-03-09
    • 2021-11-17
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多