RRULE(Recurrence Rule)
「カレンダー予定の繰り返し設定ってどう実装するんだ?」という疑問からRRULE(Recurrence Rule)というものを知ったのでメモ。
iCalendarについて規定している RFC5545 があって、その 3.3.10 Recurrence Rule のセクションに繰り返しルールについての記載がある。
書式はこんな感じ。
recur = recur-rule-part *( ";" recur-rule-part )
recur-rule-part = ( "FREQ" "=" freq )
/ ( "UNTIL" "=" enddate )
/ ( "COUNT" "=" 1*DIGIT )
/ ( "INTERVAL" "=" 1*DIGIT )
/ ( "BYSECOND" "=" byseclist )
/ ( "BYMINUTE" "=" byminlist )
/ ( "BYHOUR" "=" byhrlist )
/ ( "BYDAY" "=" bywdaylist )
/ ( "BYMONTHDAY" "=" bymodaylist )
/ ( "BYYEARDAY" "=" byyrdaylist )
/ ( "BYWEEKNO" "=" bywknolist )
/ ( "BYMONTH" "=" bymolist )
/ ( "BYSETPOS" "=" bysplist )
/ ( "WKST" "=" weekday )
わかりやすいとこだけ見ると、FREQ
には"SECONDLY" / "MINUTELY" / "HOURLY" / "DAILY" / "WEEKLY" / "MONTHLY" / "YEARLY"
といった周期が指定できて、INTERVAL
で間隔、UNTIL
でいつまでか、もしくはCOUNT
で繰り返し回数を指定できる。
BYSETPOS
を使うと、1 ~ 366
または-366 ~ -1
の範囲でn番目という指定ができる(カンマ区切りで複数指定可)。
これを使うと「毎月の最終就業日」はこう表せる。
FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
BYSETPOS=-1
によって、平日のなかの-1番目(= 最後の1日)を指定してる。
その他ルールの詳細についてはRFCを参照のこと。
3.8.5.3. Recurrence Rule にはサンプルもたくさん載っていてとてもたすかる。
rrule.jsというライブラリがあって、demoページで色々試すことができる。ルールを指定すると実際に展開される日付が確認できる。
さっきの「毎月の最終就業日」をルール指定してみるとこんな感じ。
細かいオプションについてはまだ理解してないけど、ひとまずこれを使えば繰り返しルールを記述することができるんだなあとわかった。
いつか使うことがあれば思い出したい。