本稿では、RFC-5545のRRULEで毎月の最後の平日を求める方法を紹介する。ここでの平日とは、土日以外の曜日を指す。国民の休日や会社カレンダーの営業日ではないので注意。
毎月の最後の平日を求めるRRULE
RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1;BYMONTHDAY=-1,-2,-3
このルールで抽出される日付の一覧はrrule.jsのデモで確認できる。
解説
このルールは下記の4つのパートに分けられる:
FREQ=MONTHLY
BYDAY=MO,TU,WE,TH,FR
BYSETPOS=-1
BYMONTHDAY=-1,-2,-3
FREQ=MONTHLY
は月次で繰り返す指定。
次に条件設定。
BYDAY=MO,TU,WE,TH,FR
は、曜日を月〜金に限定するための条件指定。これで土日が入ることはなくなる。
BYMONTHDAY=-1,-2,-3
は末日、末日の1日前、末日の2日前に限定する条件指定。月によって日数が異なるので、負の整数を使うことで、後ろからn日目といったふうに相対的な指定になっている。
ここまでで、月〜金の日で、かつ、月末の3日間を満たす日に絞り込まれる。
このままだと、毎月多くて3日間の日付がピックアップされてしまうので、BYSETPOS=-1
で最後の1日だけを抽出するように制限をかける。
給料日を求める
例えば25日が給料日。ただし、25日が土曜日なら24日が支給日になる。24日、25日が土日なら23日が支給日になるとったルールも、このRRULEを応用すると対応することができる。
RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1;BYMONTHDAY=23,24,25