6

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

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

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

4

2 回答 2

11

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

使用RSCALE扩展你RRULE会看起来像这样:

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

每月每 31 日重复发生此事件RRULE,除非那一天不存在,在这种情况下会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

于 2016-03-03T07:23:31.577 回答
9

无论是在 28 日、29 日、30 日还是 31 日,最简单RRULE的获取“本月的最后一天”的方法是:

FREQ=MONTHLY;BYMONTHDAY=-1

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

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

于 2016-04-14T06:14:24.960 回答