便利な Java 用のライブラリ AJD4JP を使えば楽ちん

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

AJD4JP 日本専用カレンダー処理 Javaクラスライブラリ

AJD4JP を使うには、最新版の ajd4jp-1.3.1.2014.jar をダウンロードしてクラスパスに通すだけでOKだった。

いろいろ出力してみるサンプルコードを書いてみた。


import java.util.Calendar;
import ajd4jp.*;
 
public class Ajd4jpSample {
 
  public static void main(String[] argv) throws Exception {
    
    // AJD は現在一般的な日時 (ユリウス通日およびグレゴリオ暦) を表すクラス
 
    System.out.println("[現在日時]");
    System.out.println(toAJDString(new AJD(Calendar.getInstance())));
    
    System.out.println("[2015年 成人の日]");
    System.out.println(toAJDString(new AJD(2015, 1, 12)));
    
    System.out.println("[2018年 バレンタインデー]");
    System.out.println(toAJDString(new AJD(2018, 2, 14)));
  }
  
  private static String toAJDString(AJD ajd){
 
    StringBuilder sb = new StringBuilder();
 
    // 西暦年、月、日、曜日
    sb.append(
      "西暦" + ajd.getYear() +
      "年" + ajd.getMonth() +
      "月" + ajd.getDay() +
      "日(" + ajd.getWeek().getJpName() + ")\n");
 
    // 和暦の年号、和暦の年、月、日
    Era.Year era = ajd.getEra();
    sb.append(
      era.getEra().getName() +
      era.getYear() + "年" +
      ajd.getMonth() + "月" +
      ajd.getDay() + "日\n");
 
    // 祝日
    Holiday h = Holiday.getHoliday(ajd);
    if(h != null){
      sb.append("祝日: " + h.getName(ajd) + "\n");
    }
 
    // 九星
    sb.append("九星: " + STCD.Kyusei.getDay(ajd).getName() + "\n");
 
    // 干支 (十干と十二支)
    SexagenaryCycle sc = SexagenaryCycle.getDay(ajd);
    sb.append(
      "干支 (十干、十二支): " +
      sc.getHeavenlyStem().getName() +
      sc.getEarthlyBranch().getName() + "\n");
 
    // 旧暦
    LunisolarYear year = LunisolarYear.getLunisolarYear(ajd);
    LSCD lscd = year.getLSCD(ajd);
 
    // 旧暦の年、月、日
    sb.append(
      "旧暦" +
      lscd.getYear() + "年" +
      lscd.getMonth() + "月" +
      lscd.getDay() + "日\n");
 
    // 旧暦の月の日本語名
    sb.append("月の日本語名: " + lscd.getMonthName() + "\n");
 
    // 旧暦の六曜(六輝)
    sb.append("六曜(六輝): " + lscd.getRokuyo().getName() + "\n");
 
    return sb.toString();
  }
}

サンプルの出力結果。


[現在日時]
西暦2015年1月7日(木)
平成27年1月7日
九星: 二黒土星
干支 (十干、十二支): 癸未
旧暦2014年11月17日
月の日本語名: 霜月
六曜(六輝): 先負
 
[2015年 成人の日]
西暦2015年1月12日(月)
平成27年1月12日
祝日: 成人の日
九星: 七赤金星
干支 (十干、十二支): 戊子
旧暦2014年11月22日
月の日本語名: 霜月
六曜(六輝): 友引
 
[2018年 バレンタインデー]
西暦2018年2月14日(水)
平成30年2月14日
九星: 二黒土星
干支 (十干、十二支): 丁丑
旧暦2017年12月29日
月の日本語名: 師走
六曜(六輝): 仏滅

2018年のバレンタインデーは仏滅らしい(・ω<)

サンプル出力した内容が合っているか、100円ショップのダイソーで買ってきた『平成二十七年 九星運勢カレンダー』と答え合わせをしてみる。

ダイソー 平成二十七年 九星運勢カレンダー

2015年1月7日は、先負、癸未、二黒。2015年1月12日は、友引、戊子、七赤。合ってる(*´ω`*)

ダイソー 平成二十七年 九星運勢カレンダー

そういうわけで、 Java で六曜や九星や干支を扱うなら AJD4JP は良さそう。

ただ、サーバサイドで使う際にはメモリ使用量に注意したほうがいいかも。

LunisolarYear#getLunisolarYear()は、このライブラリで最も計算時間を要します。
そのため、作成したインスタンスは static 変数へキャッシュして再計算しません。
上の例では再度、2012年を参照するとキャッシュされた計算済みのインスタンスを返します。

AJD4JP 新暦と旧暦、干支、六曜、九星 日本専用カレンダー処理 Javaクラスライブラリ

六曜(六輝)・九星・干支(十干・十二支)とは

六曜(ろくよう・りくよう)は、暦注の一つで、先勝・友引・先負・仏滅・大安・赤口の6種の曜がある。

日本では、暦の中でも有名な暦注の一つで、一般のカレンダーや手帳にも記載されていることが多い。今日の日本においても影響力があり、「結婚式は大安がよい」「葬式は友引を避ける」など、主に冠婚葬祭などの儀式と結びついて使用されている。

六輝(ろっき)や宿曜(すくよう)ともいうが、これは七曜との混同を避けるために、明治以後に作られた名称である。

六曜 - Wikipedia
九星(きゅうせい)は、古代中国から伝わる民間信仰で、一白・二黒・三碧・四緑・五黄・六白・七赤・八白・九紫の9つ。

九星 - Wikipedia
十干(じっかん)は、甲・乙・丙・丁・戊・己・庚・辛・壬・癸の10の要素の順列。干支を書くとき干を支の前に書くことから天干(てんかん)とも言う。

十干 - Wikipedia
十二支(じゅうにし)は、子・丑・寅・卯・辰・巳・午・未・申・酉・戌・亥の総称である(それぞれ音訓2通りの読み方がある)。十干を天干というのに対して、十二支を地支(ちし)ともいう。

十二支 - Wikipedia

追記 2015-01-08

実行結果をよく見てみたら、 new AJD(Calendar.getInstance()).getWeek().getJpName() の値がおかしい。

夜に実行すると、曜日がひとつずれてしまう。朝に実行すると正しい値が返ってくる。

Calendar オブジェクトの持つ時刻フィールドあたりが悪さをしているのかもしれない。

たぶん、 AJD4JP のバグだと思うけど詳細不明。

ref. AJD4JP 日本専用カレンダー処理 Javaクラスライブラリ

tags: java calendar

Posted by NI-Lab. (@nilab)