首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rrule.between跳过缺少天数的月份

rrule.between跳过缺少天数的月份
EN

Stack Overflow用户
提问于 2022-03-02 09:28:39
回答 2查看 139关注 0票数 0

我正试图为我正在研究的用例生成员工每月周年纪念。RRule提供了一种非常方便的方法。然而,我无法从它得到我想要的结果。

见下面的片段-

代码语言:javascript
复制
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)

结果--

代码语言:javascript
复制
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:00

rrule跳过几个月没有第31条,而国际海事组织是图书馆的预期行为。

如何以干净的方式处理丢失的月份,并将其默认值设置为2022-02-282022-04-30

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2022-05-26 12:53:37

我遇到了同样的问题,找到了一个解决方案,就是创建一个新的虚拟日期,从这个月的第一天开始,然后在rrule对象上使用它,然后如果您需要这个月的最后一天,您可以使用日历模块。

代码语言:javascript
复制
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]))
票数 0
EN

Stack Overflow用户

发布于 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。另外两个仍然是需要自定义的例外情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71320303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档