LoginSignup
2
1

More than 3 years have passed since last update.

iCaldendar RFC-5545: RRULEで毎月の最後の平日を求める

Last updated at Posted at 2019-08-08

本稿では、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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1