在第 31 天或最近的一天重复每月的规则

rrule for repeating monthly on the 31st or closest day

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

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

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

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

使用 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 显然更直观。

获得“月份的最后一天”最简单的RRULE,无论它是在 28 日、29 日、30 日还是 31 日:

FREQ=MONTHLY;BYMONTHDAY=-1

您的查询听起来就是您要查询的内容。

不过,我不知道您提到的 javascript 库是否支持此功能。