Posted at

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


概要


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


参考資料