未来六个月如何产生?
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
如评论中所述,这似乎不适用于使用 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)
rrule.rrule(rrule.DAILY, dtstart=dt_start, interval=183).after(datetime.today())
我正在尝试创建此模板。 预计于 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
如评论中所述,这似乎不适用于使用 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)
rrule.rrule(rrule.DAILY, dtstart=dt_start, interval=183).after(datetime.today())