重复事件

通过 iCalendar RRULE 语法的实用子集,让事件按日、周、月、年重复——字符串或类型化对象均可。事件的 start 即 DTSTART,每次出现都继承其时间与时长。

// String form (RFC 5545 RRULE subset)…
recurrence: 'FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=10'

// …or the equivalent object form
recurrence: {
  freq: 'weekly',      // 'daily' | 'weekly' | 'monthly' | 'yearly'
  interval: 1,         // every N periods
  byDay: [1, 3, 5],    // 0 = Sunday … 6 = Saturday
  count: 10            // or: until: new Date(2027, 0, 1)
}

// Cancel individual occurrences by date:
exdates: [new Date(2026, 7, 19)]
五种重复模式

2026年9月

周一
周二
周三
周四
周五
周六
周日
31
9月 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
10月 1
2
3
4

支持的规则要素

RRULE对象形式含义
FREQ=DAILY|WEEKLY|MONTHLY|YEARLYfreq基础频率(必填)。
INTERVAL=2interval每隔 2 天/周/月/年。
COUNT=10count共出现 10 次(从事件起始日起算)。
UNTIL=20261231until最后一次可能出现的日期(含当天)。
BYDAY=MO,WE,FRbyDay: [1,3,5]每周重复时指定星期几。
BYDAY=2TU / -1FRbyNthDay每月的第 2 个周二 / 最后一个周五。
BYMONTHDAY=1,15byMonthDay每月的指定日期。
exdates: Date[]跳过这些日期上的出现(已取消的实例)。

行为细节

  • 跨越夏令时切换时,每次出现保持原事件的“墙上时钟”时间。
  • 每月重复会跳过不存在该日期的月份(1 月 31 日 → 没有 2 月 31 日),与 Google 日历一致。
  • 起始于 2 月 29 日的每年重复只在闰年出现。
  • 重复实例带 ↻ 标记。拖动或调整某一次会弹出确认层,提供“仅此日程”(拆分该次为独立日程)与“此次及以后”(在该点拆分系列)两种选择——与 Google 日历一致。
  • 详情弹层提供“删除仅此次”(添加 exdate)与“删除整个系列”两个操作。
  • 展开仅针对可见范围,且每个事件硬上限 1000 次,可安全使用无限重复规则。
编辑重复系列 — “仅此日程”与“此次及以后”均已内置:onSeriesDetach / onSeriesSplit 回调上报结果,COUNT 与 exdates 自动重新分配,拖拽改变星期几时每周 BYDAY 列表会自动重锚。纯函数 detachOccurrence、excludeOccurrence、splitSeries 也已导出供数据层使用。