rrule在31日或最近的一天重复每月

aro*_*101 2 javascript rrule

如何在每个月的第31天(或30日或29日)为每个月复发的事件指定一个事件的套期,如果月份没有足够的天数则选择最接近的事件(即2月它会选择28日或29日,四月会选择第30名)?

从技术上讲,我正在使用rrule javascript库,如果这是相关的.

要添加上下文,我有一个表单,用户可以指定开始日期重复(每年,每月,每周,每天),就像账单一样.如果账单通常在30日到期,那么在2月将到期,这将是28日(或29日).

tgi*_*007 9

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

FREQ=MONTHLY;BYMONTHDAY=-1
Run Code Online (Sandbox Code Playgroud)

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

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

  • rrule javascript 库似乎有一个 [demo](https://jakubroztocil.github.io/rrule),可以在其中测试可能的解决方案。`FREQ=MONTHLY;BYMONTHDAY=-1` 在 _RRULE String_ 下输入时产生预期结果作为输入。 (2认同)

Mar*_*ten 7

有一个新的扩展RRULE要求RSCALE覆盖该案例.不幸的是,它还没有被广泛支持.不确定您正在使用的Javascript rrule库,但如果不是这样,您应该打开一个问题.

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

FREQ=MONTHLY;RSCALE=GREGORIAN;BYMONTHDAY=31;SKIP=BACKWARD
Run Code Online (Sandbox Code Playgroud)

RRULE每个月每31日复发一次的事件,除非那天不存在,否则SKIP=BACKWARD说"使用前一个有效日".

编辑

我刚刚意识到另一种表达方式,没有RSCALE:

每个月31日,回溯到该月的最后一个有效日:

FREQ=MONTHLY;BYMONTHDAY=28,29,30,31;BYSETPOS=-1
Run Code Online (Sandbox Code Playgroud)

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

FREQ=MONTHLY;BYMONTHDAY=28,29,30;BYSETPOS=-1
Run Code Online (Sandbox Code Playgroud)

每个月29日,在非闰年,可以回到2月28日

FREQ=MONTHLY;BYMONTHDAY=28,29;BYSETPOS=-1
Run Code Online (Sandbox Code Playgroud)

但是,正如人们可以看到的那样,这显然更为直观RSCALE.