未来六个月如何产生?

How to generate the next six months?

我正在尝试创建此模板。 预计于 2022 年 9 月 30 日或 2022 年 10 月 1 日收到

但我在同一天得到下一年!

>>> datetime.today()
datetime.datetime(2022, 3, 31, 9, 21, 49, 315991)
>>> rrule.rrule(freq=rrule.MONTHLY, interval=6, dtstart=datetime.today()).after(datetime.today())
datetime.datetime(2023, 3, 31, 9, 18, 3)

编辑

我想获取一系列日期(每 6 个月)并取最近的日期:

rrule.rrule(freq=rrule.MONTHLY, interval=6, dtstart=some_date).after(datetime.today())

像您一样使用 rrule 并查看它的文档,您需要设置一些参数

from dateutil.rrule import rrule, MONTHLY
from datetime import datetime, timedelta

today = datetime.today() - timedelta(days=1)

# Use rrule to for 6 months from today
six_months = rrule(freq=MONTHLY, interval=6, count=3, dtstart=today)
six_months_list = list(six_months)

# Rrule to date object
for i in six_months_list:
    print(i)

这会产生输出

2020-01-01 00:00:00
2020-07-01 00:00:00
2021-01-01 00:00:00

INTERVAL 是您想要的月份,因为频率为 MONTHLY COUNT 是列表中出现的次数,即 3

See documentation for rrule

如评论中所述,这似乎不适用于使用 datetime.today()。我需要进一步调查,但如果使用 timedelta(days=1) 添加或减去日期,它确实有效。

from datetime import date
from dateutil.relativedelta import relativedelta

six_months = date.today() + relativedelta(months=+6)

输出将是:

>>> date.today()
datetime.date(2022, 3, 31)
>>> six_months
datetime.date(2022, 9, 30)

这种方法的优点是它可以解决 28、30、31 天等问题

编辑:

relativedelta 使用这些参数:

years, months, weeks, days, hours, minutes, seconds, microseconds

您还可以将它与任何日期时间对象一起使用。

示例:

>>> from datetime import datetime
>>> date_time_str = '18/09/19 01:55:19'
>>> date_time_obj = datetime.strptime(date_time_str, '%d/%m/%y %H:%M:%S')
>>> date_time_obj + relativedelta(years=+7, months=-2, weeks=+16, days=-5, hours=+90, minutes=-100, seconds=+10, microseconds=+20)
datetime.datetime(2026, 11, 5, 18, 15, 29, 20)

Documentation for relativedelta

rrule.rrule(rrule.DAILY, dtstart=dt_start, interval=183).after(datetime.today())