r规则,用于每月在 31 日或最近一天重复

rrule for repeating monthly on the 31st or closest day

本文关键字:最近 一天 规则 用于      更新时间:2023-09-26

您将如何为每月第 31 天(或 30 日或 29 日)的每个月重复发生的事件指定 rrule,如果该月没有足够的天数,它会选择最接近的(即 2 月它会选择 28 日或 29 日,4 月它会选择 30 日)?

从技术上讲,如果相关,我正在使用 rrule javascript 库。

为了添加上下文,我有一个表单,用户可以在其中指定重复周期(每年、每月、每周、每天)的开始日期,例如账单。 如果账单通常在 30 日到期,那么在 2 月它将在 28 日(或 29 日)到期。

RRULE有一个名为RSCALE的新扩展名来涵盖这种情况。不幸的是,它还没有得到广泛的支持。不确定您正在使用的 Javascript rrule 库,但如果不是这种情况,您应该打开一个问题。

使用 RSCALE 扩展名,您的RRULE如下所示:

FREQ=MONTHLY;RSCALE=GREGORIAN;BYMONTHDAY=31;SKIP=BACKWARD

具有此RRULE的事件在每个月的 31 日重复发生,除非该日期不存在,在这种情况下SKIP=BACKWARD说"使用前一个有效日期"。

编辑

我刚刚意识到另一种表达方式,无需RSCALE

每月 31 日,回退到该月最后一个有效日期:

FREQ=MONTHLY;BYMONTHDAY=28,29,30,31;BYSETPOS=-1

每月 30 日,2 月回落到 28 日或 29 日(闰年)

FREQ=MONTHLY;BYMONTHDAY=28,29,30;BYSETPOS=-1

每月29日,非闰年回落至2月28

FREQ=MONTHLY;BYMONTHDAY=28,29;BYSETPOS=-1

但是,正如人们所看到的,这显然更直观 RSCALE .

无论它是在 28 日、29 日、30 日还是 31 日,获取"每月的最后一天"的最简单RRULE是:

FREQ=MONTHLY;BYMONTHDAY=-1

您的查询听起来就像这就是您所追求的。

但是,我不知道您提到的 rrule javascript 库是否支持这一点。