Java + AJD4JP で和暦の情報 (元号・祝日・旧暦・干支・六曜・九星) を表示する

## 概要

- Java 用のライブラリ AJD4JP を用いて和暦の情報 (元号・旧暦・干支・六曜・九星) を表示する
- AJD4JP はバージョン 1\.4\.5\.2019 から新元号「令和」に対応している

## AJD4JP (Astronomical Julian Day for Japan) について

[AJD4JP について \[AJD4JP 日本専用カレンダー処理 Javaクラスライブラリ\]](http://ajd4jp.osdn.jp/doku.php)

> Java用の、日本向け万年暦カレンダー処理を行うための開発ライブラリです。
> 令和などの元号や、過去(明治時代)から現在にかけての祝日(山の日、振替休日や春分の日、ハッピーマンデー含む)の取得が可能です。
> また、旧暦や六曜(または六輝)、干支(年・月・日・時)や九星(年・月・日・時)の取得も可能です。
> ユリウス通日(ユリウス日)を使用するため、物理的に表現可能な日時範囲が大きい事も特徴です。
> 漢数字での表現など、日時の書式化機能や文字列の全角半角変換・判定機能も持ちます。

[Release ajd4jp 1\.4\.6\.2019 \- AJD4JP 日本専用カレンダー処理 Javaクラスライブラリ \- OSDN](https://osdn.net/projects/ajd4jp/releases/70961)

> 元号法。
> 2019年5月1日以降、元号判定結果が「令和」となります。
> 
> 皇室典範特例法。
> 2019年5月1日以降「天皇誕生日」が12月23日から2月23日となります。
> 
> 国民の祝日に関する法律の一部を改正する法律（平成30年法律第57号）。
> 2020年以降「体育の日」の名称が「スポーツの日」となります。
> 
> 「国民の祝日に関する法律」の特例(2020年東京オリンピック・パラリンピック競技大会)。
> 2020年に限り「海の日」は7月23日となります。
> 2020年に限り「スポーツの日」は7月24日となります。
> 2020年に限り「山の日」は8月10日となります。
> 
> 本リリースはjava6環境で実行可能ですが、次回リリースよりjava8以降でビルドする予定です。

## 今回の環境

- macOS 10.14 Mojave
- OpenJDK 12
- AJD4JP 1.4.6.2019

```
$ java -version
openjdk version "12" 2019-03-19
OpenJDK Runtime Environment (build 12+33)
OpenJDK 64-Bit Server VM (build 12+33, mixed mode, sharing)

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.4
BuildVersion:	18E226
```

## ソースコード

```java
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

import ajd4jp.AJD;
import ajd4jp.Era;
import ajd4jp.Holiday;
import ajd4jp.SexagenaryCycle;
import ajd4jp.LunisolarYear;
import ajd4jp.LSCD;
import ajd4jp.STCD;
import ajd4jp.format.Formats;
import ajd4jp.format.JapaneseYearF;
import ajd4jp.format.MonthF;
import ajd4jp.format.DayF;
import ajd4jp.format.WeekF;
import ajd4jp.format.Two;
import ajd4jp.format.TwoJapan;
import ajd4jp.format.C;

// 和暦情報を出力するクラス
public class JapaneseDate {

    public static void main(String[] argv) {

        JapaneseDate jd = new JapaneseDate();

        // GregorianCalendar の第2引数 Month 値は0から始まるので1を引く(1月の場合は0を指定)

        // 昭和 最後の日
        jd.print(new GregorianCalendar(1989, 1 - 1, 7));

        // 平成 最初の日
        jd.print(new GregorianCalendar(1989, 1 - 1, 8));

        // 平成 最後の日
        jd.print(new GregorianCalendar(2019, 4 - 1, 30));

        // 令和 最初の日
        jd.print(new GregorianCalendar(2019, 5 - 1, 1));

        // 令和の天皇誕生日
        jd.print(new GregorianCalendar(2020, 2 - 1, 23));

        // 令和2年から「体育の日」は「スポーツの日」に名称変更
        jd.print(new GregorianCalendar(2020, 7 - 1, 24));
    }

    /**
     * 指定した Calendar オブジェクトに対応する和暦情報を出力します。
     * @param cal 和暦情報を出力したい日付の Calendar オブジェクト
     */
    public void print(Calendar cal) {

        AJD ajd = new AJD(cal);

        // 西暦の年、月、日、曜日
        SimpleDateFormat sdf = new SimpleDateFormat("Y年M月d日(E曜日)", new Locale("ja", "JP"));
        String seireki = sdf.format(cal.getTime());
        System.out.println("西暦: " + seireki);

        // 和暦の元号、年、月、日、曜日
        Era.Year era = ajd.getEra();
        String wareki =
            era.getEra().getName() + era.getYear() + "年" +
            ajd.getMonth() + "月" + ajd.getDay() + "日(" + ajd.getWeek().getJpName() + "曜日)";
        System.out.println("和暦: " + wareki);

        // 和暦の漢数字
        System.out.println("和暦(漢数字): " + format.toString(ajd));

        // 祝日
        Holiday h = Holiday.getHoliday(ajd);
        if (h != null) {
            String shukujitsu = h.getName(ajd);
            System.out.println("祝日: " + shukujitsu);
        }

        // 干支 (十干と十二支)
        SexagenaryCycle sc = SexagenaryCycle.getDay(ajd);
        String jikkan = sc.getHeavenlyStem().getName();
        String junishi = sc.getEarthlyBranch().getName();
        System.out.println("干支(十干): " + jikkan);
        System.out.println("干支(十二支): " + junishi);

        // 旧暦
        LunisolarYear year = LunisolarYear.getLunisolarYear(ajd);
        LSCD lscd = year.getLSCD(ajd);

        // 旧暦の年、月、日
        String kyureki = lscd.getYear() + "年" + lscd.getMonth() + "月" + lscd.getDay() + "日";
        System.out.println("旧暦: " + kyureki);

        // 旧暦の和風月名
        String getsumei = lscd.getMonthName();
        System.out.println("旧暦の和風月名: " + getsumei);

        // 六曜
        String rokuyo = lscd.getRokuyo().getName();
        System.out.println("六曜: " + rokuyo);

        // 九星
        String kyusei = STCD.Kyusei.getDay(ajd).getName();
        System.out.println("九星: " + kyusei);

        System.out.println();
    }

    // 和暦の漢数字表記用フォーマットクラス
    private static Formats format = new Formats(
        new JapaneseYearF(
            new TwoJapan(
                Two.Rule.FIRST, // 1を元と表記する。
                Two.Rule.TRIPLE // 21以上の場合、三文字で表記する。
            )
        ),
        new C("年"),
        new MonthF(new TwoJapan()),
        new C("月"),
        new DayF(
            new TwoJapan(
                Two.Rule.TENS // 10～19の場合、1ではなく十で表記する。
            )
        ),
        new C("日 "),
        new WeekF(),
        new C("曜日  ")
    );
}
```

## コンパイル

```
$ ls
JapaneseDate.java	ajd4jp-1.4.6.2019.jar

$ javac -classpath ajd4jp-1.4.6.2019.jar JapaneseDate.java
```

## 実行結果

```
$ java -classpath ajd4jp-1.4.6.2019.jar:. JapaneseDate
西暦: 1989年1月7日(土曜日)
和暦: 昭和64年1月7日(土曜日)
和暦(漢数字): 昭和六十四年一月七日 土曜日  
干支(十干): 丁
干支(十二支): 卯
旧暦: 1988年11月30日
旧暦の和風月名: 霜月
六曜: 仏滅
九星: 四緑木星

西暦: 1989年1月8日(日曜日)
和暦: 平成1年1月8日(日曜日)
和暦(漢数字): 平成元年一月八日 日曜日  
干支(十干): 戊
干支(十二支): 辰
旧暦: 1988年12月1日
旧暦の和風月名: 師走
六曜: 赤口
九星: 五黄土星

西暦: 2019年4月30日(火曜日)
和暦: 平成31年4月30日(火曜日)
和暦(漢数字): 平成三十一年四月三〇日 火曜日  
祝日: 国民の休日
干支(十干): 丁
干支(十二支): 酉
旧暦: 2019年3月26日
旧暦の和風月名: 弥生
六曜: 仏滅
九星: 一白水星

西暦: 2019年5月1日(水曜日)
和暦: 令和1年5月1日(水曜日)
和暦(漢数字): 令和元年五月一日 水曜日  
祝日: 天皇の即位の日
干支(十干): 戊
干支(十二支): 戌
旧暦: 2019年3月27日
旧暦の和風月名: 弥生
六曜: 大安
九星: 二黒土星

西暦: 2020年2月23日(日曜日)
和暦: 令和2年2月23日(日曜日)
和暦(漢数字): 令和二年二月二三日 日曜日  
祝日: 天皇誕生日
干支(十干): 丙
干支(十二支): 申
旧暦: 2020年1月30日
旧暦の和風月名: 睦月
六曜: 赤口
九星: 八白土星

西暦: 2020年7月24日(金曜日)
和暦: 令和2年7月24日(金曜日)
和暦(漢数字): 令和二年七月二四日 金曜日  
祝日: スポーツの日
干支(十干): 戊
干支(十二支): 辰
旧暦: 2020年6月4日
旧暦の和風月名: 水無月
六曜: 先負
九星: 七赤金星
```

## 参考資料

- [AJD4JP について \[AJD4JP 日本専用カレンダー処理 Javaクラスライブラリ\]](http://ajd4jp.osdn.jp/doku.php)
- [Release ajd4jp 1\.4\.6\.2019 \- AJD4JP 日本専用カレンダー処理 Javaクラスライブラリ \- OSDN](https://osdn.net/projects/ajd4jp/releases/70961)
- [AJD4JP 1\.4\.6\.2019 API 仕様](http://ajd4jp.osdn.jp/api/)
- [GregorianCalendar \(Java SE 12 & JDK 12 \)](https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/GregorianCalendar.html)