LoginSignup
2
2

More than 5 years have passed since last update.

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

Posted at

概要

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

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

AJD4JP について [AJD4JP 日本専用カレンダー処理 Javaクラスライブラリ]

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

Release ajd4jp 1.4.6.2019 - AJD4JP 日本専用カレンダー処理 Javaクラスライブラリ - OSDN

元号法。
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

ソースコード

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日
旧暦の和風月名: 水無月
六曜: 先負
九星: 七赤金星

参考資料

2
2
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
2