祝日の取得

祝日法で定められた祝日以外にも、夏期休暇や創立記念日、第一・第三水曜日が定休日など、一定のルールに従った休日を判定することが可能です。
ここでは、法律で定められたものを「祝日」、仕事や学校などが休みとなる日を「休日」と呼んでいます。
一般的な週休二日制であれば、毎週土日と祝日全てが休日です。

Holidayが祝日を表す列挙型になっています。
また指定年を参照し、祝日名や祝日判定ルール(ハッピーマンデー導入等)を決定しています。

import ajd4jp.*;

public class Test {
  public static void main(String[] argv) throws AJDException {
    // 2009/5 を設定。
    Month  mon = new Month(2009, 5);
    // 1ヶ月分を取得。
    String  title = String.format("%d年 %d月", mon.getYear(), mon.getMonth());
    System.out.println( title );
    for (AJD day: mon.getDays()) {
      int   d = day.getDay();
      Week  w = day.getWeek();
      Holiday h = Holiday.getHoliday(day);
      String  note = "";
      if (h != null) {
        note = h.getName(day);
      }
      String  line = String.format("%2d(%s): %s", d, w.getJpName(), note);
      System.out.println(line);
    }
  }
}
出力例
2009年 5月
 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(土):
31(日):

祝日を参照すると、一年間全ての祝日を計算してから結果を返します。
上の例では5月のみ表示していますが、2009年全ての祝日を計算しています。
その結果は static 変数へ格納されるため、再度2009年(5月以外であっても)を参照するとキャッシュした、計算済みの祝日を返します。

OffProviderクラスは、会社や学校内のような、ローカルに定められた休日を判定します。
OffProvider.Offインターフェイスは、休日の種別を特定するために利用可能です。
判定は次の順序で行われます。

  1. 祝日であるか?コンストラクタで祝日を休日とみなさないよう指定する事も可能です。
  2. addOffメソッドで指定された休日であるか?
  3. コンストラクタで指定した曜日であるか?
import ajd4jp.*;

public class Test {
  // 冬期休暇
  private static class NewYear implements OffProvider.Off {
    public String toString() {
      return "年末年始休業日";
    }
  }

  // 祝日と毎週土日を休日とする
  public static OffProvider   MyCompanyOff
    = new OffProvider(true, Week.SATURDAY, Week.SUNDAY);

  public static void main(String[] argv) throws AJDException {
    init();
    // 2011/12 を設定。
    Month  mon = new Month( 2011, 12 );
    print( mon );
    print( mon.add( 1 ) );
  }

  /** 休日の追加 */
  private static void init() throws AJDException {
    // 年は無視されるので、何年でも構いません
    AJD  from = new AJD(2000, 12, 29);
    AJD  to = new AJD(2000, 1, 4);
    // 12/29 ~ 1/4 を冬期休暇にします
    MyCompanyOff.addOffEveryYear(from, to, new NewYear());
  }

  /** 月のカレンダー表示 */
  private static void print(Month mon) {
    String  title = String.format("%d年 %d月  -----------------------",
      mon.getYear(), mon.getMonth());
    System.out.println(title);
    for (AJD day: mon.getDays()) {
      int   d = day.getDay();
      Week  w = day.getWeek();
      OffProvider.Off off = MyCompanyOff.getOff(day);
      String  note = "";
      if (off != null) {
        if (off instanceof Holiday) {
          note = ((Holiday)off).getName(day);
        }
        else if (off instanceof Week) {
          note = "休業日";
        }
        else {
          note = off.toString();
        }
      }
      String  line = String.format("%02d(%s): %s", d, w.getJpName(), note);
      System.out.println(line);
    }
    System.out.println();   // 空行
  }
}
出力例
2011年 12月  -----------------------
01(木):
02(金):
03(土): 休業日
04(日): 休業日
05(月):
06(火):
07(水):
08(木):
09(金):
10(土): 休業日
11(日): 休業日
12(月):
13(火):
14(水):
15(木):
16(金):
17(土): 休業日
18(日): 休業日
19(月):
20(火):
21(水):
22(木):
23(金): 天皇誕生日
24(土): 休業日
25(日): 休業日
26(月):
27(火):
28(水):
29(木): 年末年始休業日
30(金): 年末年始休業日
31(土): 年末年始休業日

2012年 1月  -----------------------
01(日): 元日
02(月): 振替休日
03(火): 年末年始休業日
04(水): 年末年始休業日
05(木):
06(金):
07(土): 休業日
08(日): 休業日
09(月): 成人の日
10(火):
11(水):
12(木):
13(金):
14(土): 休業日
15(日): 休業日
16(月):
17(火):
18(水):
19(木):
20(金):
21(土): 休業日
22(日): 休業日
23(月):
24(火):
25(水):
26(木):
27(金):
28(土): 休業日
29(日): 休業日
30(月):
31(火):