我正试图为我正在研究的用例生成员工每月周年纪念。RRule提供了一种非常方便的方法。然而,我无法从它得到我想要的结果。
见下面的片段-
import arrow
from dateutil.rrule import MONTHLY, rrule
by_monthday = 31
start = arrow.get("2021-12-31").to(tz="utc")
end = arrow.get("2022-06-01").to(tz="utc")
rule = rrule(
freq=MONTHLY,
bymonthday=by_monthday,
byhour=0,
byminute=0,
bysecond=0,
dtstart=start.datetime,
)
for r in rule.between(start.datetime, end.datetime, inc=True):
print(r)结果--
2021-12-31 00:00:00+00:00
2022-01-31 00:00:00+00:00
2022-03-31 00:00:00+00:00
2022-05-31 00:00:00+00:00rrule跳过几个月没有第31条,而国际海事组织是图书馆的预期行为。
如何以干净的方式处理丢失的月份,并将其默认值设置为2022-02-28或2022-04-30
谢谢!
发布于 2022-05-26 12:53:37
我遇到了同样的问题,找到了一个解决方案,就是创建一个新的虚拟日期,从这个月的第一天开始,然后在rrule对象上使用它,然后如果您需要这个月的最后一天,您可以使用日历模块。
import datetime, calendar
from dateutil.rrule import MONTHLY, rrule
by_monthday = 1
start = datetime.datetime(2021, 12, 31)
end = datetime.datetime(2022, 6, 1)
rule = rrule(
freq=MONTHLY,
bymonthday=by_monthday,
byhour=0,
byminute=0,
bysecond=0,
dtstart=datetime.datetime(start.year, start.month, 1),
)
for r in rule.between(start, end, inc=True):
print(datetime.datetime(r.year, r.month, calendar.monthrange(r.year, r.month)[1]))发布于 2022-06-21 16:15:18
如果有一个名为includeshortmonths in dateutil.rrule的旗子与bymonthday协同工作,那就太好了,
bymonthday=31 includeshortmonths=True返回1月31日,2月28日,3月31日,4月30日.
bymonthday=30 includeshortmonths=True 1月30日、2月28日、3月30日、4月30日.
bymonthday=29 includeshortmonths=True返回1月29日,2月28日,3月29日,4月29日.
代替,只需使用适用于第一个示例的bymonthday=-1。另外两个仍然是需要自定义的例外情况。
https://stackoverflow.com/questions/71320303
复制相似问题