Akihito Ikeda

RRULE(Recurrence Rule)

posts/2021-07-24diary

「カレンダー予定の繰り返し設定ってどう実装するんだ?」という疑問から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ページで色々試すことができる。ルールを指定すると実際に展開される日付が確認できる。

さっきの「毎月の最終就業日」をルール指定してみるとこんな感じ

細かいオプションについてはまだ理解してないけど、ひとまずこれを使えば繰り返しルールを記述することができるんだなあとわかった。

いつか使うことがあれば思い出したい。

© Akihito Ikeda - Last update 22.08.2021 19:15.