首页 > 解决方案 > FullCalendar V4 - 如何在重复事件系列中计算较短的月份?

问题描述

我正在使用带有RRule 插件的FullCalendar v4-alpha-3来生成重复事件。它按预期工作,只有一个问题:如何修改重复事件以说明比系列中起始月份天数更少的月份?

例如,如果第一次发生在 2019 年 1 月 29 日;由于只有 28 天(不包括闰年),该事件将在所有后续月份的 29 日重复,2 月除外。

我试过重置dtstart到下个月的第一天。它可以工作,只是事件不再是递归的。

这是我的设置的精简片段:

let calendar = new Calendar(calendarEl, {
  plugins: [ rrulePlugin ],
  events: [
    {
      rrule: 'DTSTART:20190129 RRULE:FREQ=MONTHLY;UNTIL=20200130;COUNT=13;BYMONTHDAY=29'
    }
  ],
  eventRender: function(info) {
    ...

    // reset start date to the first day of the following month 
    // if current month has fewer days than base month

    let start = event.start;
    let day = start.getDate();            

    let now = new Date();
    let currentMonth = now.getMonth();     
    let currentYear = now.getFullYear();
    let daysInCurrent = getDaysInMonth(currentMonth + 1, currentYear);

    let nextStart = start;
    if (day > daysInCurrent) {
        nextStart = new Date(currentYear, currentMonth + 1, 1);    
        event.setStart(nextStart);   
        event.setEnd(null);                     
    } 
  }
});

我会很感激任何见解。

标签: recurring-eventsrrulefullcalendar-4

解决方案


不是我所希望的解决方案,但 RRule 的bysetpos属性似乎提供了下一个最佳选择,因为它允许在指定日期不存在的情况下使用回退日期。

例如,以下将在每个月的 30 日生成一个事件;如果不存在 30 日,则为该月的最后一天:

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

来源:https ://icalevents.com/2555-paydays-last-working-days-and-why-bysetpos-is-useful/


推荐阅读