六曜・九星・干支

新暦の他、旧暦、節切りのカレンダー処理が行えます。
また、干支、六曜、九星の取得が可能です。

旧暦の時間を直接表すクラスは LSCD ですが、LSCD は LunisolarYear クラスから取得します。LunisolarYear は旧暦での一年間を表しています。
六曜(Rokuyo 列挙型)は LSCD クラスから得られます。

import ajd4jp.*;

public class Test {
    public static void main(String[] argv) throws AJDException {
        // 2012年の旧暦
        LunisolarYear yy = LunisolarYear.getLunisolarYear(2012);
        int leap = yy.getLeapMonth();
        for (int mm = 1; mm <= 12; mm++) {
            print(yy, mm, false);
            // 続けて閏月の表示
            if (leap == mm) { print( yy, mm, true ); }
        }
    }

    /** 毎月の表示 */
    private static void print(LunisolarYear yy, int mm, boolean leap) throws AJDException {
        // 毎月の初日と最終日の取得
        LSCD start = yy.getLSCD(mm, leap, 1);
        int last = yy.getLastDay(mm, leap);
        LSCD end = yy.getLSCD(mm, leap, last);
        String  info = String.format("%d年%s%02d月(%s)\t%s ~ %s",
            start.getYear(),
            start.isLeapMonth()? "閏": "", start.getMonth(), start.getMonthName(),
            toString(start), toString(end)
        );
        System.out.println(info);
    }

    /** 日付情報の作成 */
    private static String toString(LSCD dd) {
        AJD ajd = dd.toAJD();
        String  str = String.format("%d日(%s):[新暦:%d/%02d/%02d]",
            dd.getDay(), dd.getRokuyo().getName(),
            ajd.getYear(), ajd.getMonth(), ajd.getDay()
        );
        return str;
    }
}
出力例
2012年01月(睦月)        1日(先勝):[新暦:2012/01/23] ~ 30日(赤口):[新暦:2012/02/21]
2012年02月(如月)        1日(友引):[新暦:2012/02/22] ~ 29日(赤口):[新暦:2012/03/21]
2012年03月(弥生)        1日(先負):[新暦:2012/03/22] ~ 30日(友引):[新暦:2012/04/20]
2012年閏03月(閏弥生)    1日(先負):[新暦:2012/04/21] ~ 30日(友引):[新暦:2012/05/20]
2012年04月(卯月)        1日(仏滅):[新暦:2012/05/21] ~ 30日(先負):[新暦:2012/06/19]
2012年05月(皐月)        1日(大安):[新暦:2012/06/20] ~ 29日(先負):[新暦:2012/07/18]
2012年06月(水無月)      1日(赤口):[新暦:2012/07/19] ~ 30日(大安):[新暦:2012/08/17]
2012年07月(文月)        1日(先勝):[新暦:2012/08/18] ~ 29日(大安):[新暦:2012/09/15]
2012年08月(葉月)        1日(友引):[新暦:2012/09/16] ~ 29日(赤口):[新暦:2012/10/14]
2012年09月(長月)        1日(先負):[新暦:2012/10/15] ~ 30日(友引):[新暦:2012/11/13]
2012年10月(神無月)      1日(仏滅):[新暦:2012/11/14] ~ 29日(友引):[新暦:2012/12/12]
2012年11月(霜月)        1日(大安):[新暦:2012/12/13] ~ 30日(仏滅):[新暦:2013/01/11]
2012年12月(師走)        1日(赤口):[新暦:2013/01/12] ~ 29日(仏滅):[新暦:2013/02/09]
  • 上の例では、新暦の 2012/01/23 が 旧暦の 2012/01/01 にあたります。
    また、その日の六曜は先勝です。
  • LunisolarYear#getLunisolarYear()は、このライブラリで最も計算時間を要します。
    そのため、作成したインスタンスは static 変数へキャッシュして再計算しません。
    上の例では再度、2012年を参照するとキャッシュされた計算済みのインスタンスを返します。

立春を年始めとする、節切り(節月)と呼ばれる月の区切り方をする一般の旧暦および新暦とも異なる体系の暦があります。
STCD クラスは、この節切りでの時間を表します。
九星(Kyusei 列挙型)は、STCD クラスに所属しています。

import ajd4jp.*;

public class Test {
    public static void main(String[] argv) throws AJDException {
        // 2011/11/11 11:00:00 を指定
        AJD ajd = new AJD(2011, 11, 11, 11, 0, 0);
        System.out.println(ajd);
        System.out.println(String.format("年:%s",
            STCD.Kyusei.getYear(ajd).getName()));
        System.out.println(String.format("月:%s",
            STCD.Kyusei.getMonth(ajd).getName()));
        System.out.println(String.format("日:%s",
            STCD.Kyusei.getDay(ajd).getName()));
        System.out.println(String.format("時:%s",
            STCD.Kyusei.getTime(ajd).getName()));
    }
}
出力例
2011/11/11 11:00:00[2455876.583333333333333333333333333333]
年:七赤金星
月:八白土星
日:九紫火星
時:三碧木星

九星は入力に使用する暦に関係なく、常に節月へ変換してから判定されます。

干支は、十干(HeavenlyStem 列挙型)と十二支(EarthlyBranch 列挙型)を組み合わせたもので、SexagenaryCycle クラスがそれを表します。
この例のように、普段見られる年の干支の他、月・日・時にもそれぞれ干支は割り当てられています。
また、この例のようにすれば AJD(新暦) と同一日を表す LSCD(旧暦)、STCD(節切りの暦)を取得できます。

import ajd4jp.*;

public class Test {
    public static void main(String[] argv) throws AJDException {
        // 2012/01/01 01:00:00 を設定
        AJD ajd = new AJD( 2012, 1, 1, 1, 0, 0 );							// 通常の暦
        LSCD lscd = LunisolarYear.getLunisolarYear( ajd ).getLSCD( ajd );	// 旧暦
        STCD stcd = new STCD( ajd );										// 節切り
        print("新暦:", ajd);
        print("旧暦:", lscd);
        print("節月:", stcd);
    }

    private static void print(String title, Day date) {
        String  year = String.format("%d年(%s) ", date.getYear(),
            SexagenaryCycle.getYear(date));
        String  month = String.format("%2d月(%s) ", date.getMonth(),
            SexagenaryCycle.getMonth(date));
        String  day = String.format("%2d日(%s) ", date.getDay(),
            SexagenaryCycle.getDay(date));
        String  time = String.format("%2d時(%s) ", date.getHour(),
            SexagenaryCycle.getTime(date));
        System.out.println(title + year + month + day + time);
    }
}
出力例
新暦:2012年(壬辰)  1月(壬寅)  1日(辛酉)  1時(己丑)
旧暦:2011年(辛卯) 12月(辛丑)  8日(辛酉)  1時(己丑)
節月:2011年(辛卯) 11月(庚子) 26日(辛酉)  1時(己丑)

同一日であっても暦によって年始時期や月が変わります。そのため使う暦により、年と月の干支は別の値となります。
一方、日と時の干支は暦に関係なく、同一日であれば同じ値になります。

1.3.4.2015 より STCD.Doyo 列挙型が追加されています。土用を取得するためのものです。
以下のような用途を想定しています。

  • 節分の取得。
  • 土用丑の日の取得。

土用とは、立春・立夏・立秋・立冬の直前約18日間を指します。つまり年に4回登場します。
また、土用の最終日は全て節分(季節を分ける日)と呼びますが、一般的には立春(節切りの年始日)の前日(節切りの大晦日)のみを指す場合がほとんどです。
同様に、土用の期間に登場する丑の日は全て土用丑の日となるわけですが、夏の土用期間中の丑の日のみを指す場合がほとんどです。

import ajd4jp.*;
import ajd4jp.format.*;

public class Test {
    public static void main(String[] argv) throws Exception {
        for (int year = 2020; year <= 2025; year++) {
            System.out.println(year + "年");
            // 節分
            AJD[] doyo = STCD.Doyo.WINTER.getDoyo(year);
            System.out.println("節分");
            System.out.println(Formats.DATE.toString(doyo[doyo.length - 1]));

            // 土用丑の日(2日存在する場合があります)
            System.out.println("土用丑の日");
            for (AJD usi: STCD.Doyo.SUMMER.getDoyo(year, EarthlyBranch.CHU)) {
                System.out.println(Formats.DATE.toString(usi));
            }
            System.out.println();
        }
    }
}
出力例
2020年
節分
2020/02/03
土用丑の日
2020/07/21
2020/08/02

2021年
節分
2021/02/03
土用丑の日
2021/07/28

2022年
節分
2022/02/03
土用丑の日
2022/07/23
2022/08/04

2023年
節分
2023/02/03
土用丑の日
2023/07/30

2024年
節分
2024/02/03
土用丑の日
2024/07/24
2024/08/05

2025年
節分
2025/02/02
土用丑の日
2025/07/19
2025/07/31