しばらく更新していなかったので、暦を干支に対応させる方法というごく基本的な所からおさらいしましょう。2019年6月19日なら己亥年、庚午月、丁亥日となるものです。
天文学で広く用いられているJulian Day(JD)に基礎を置いた汎用性の高いものです。
私たちが今日用いている日付はグレゴリオ暦で決められていますね。グレゴリオ暦には閏年があって一年の長さが一定ではありません。このことが天文学では不都合なので一年の長さが365.25日に固定されているユリウス暦を用います。このユリウス暦で算出した日にちをJulian Day(ユリウス日)といいます。
六十花甲子(干支:えと)の計算にもこのユリウス日を使います。
現在のグレゴリオ暦での日にちをユリウス日に換算する式は次のようなものです。
JD=[365.25Y]+[30.59(M-2)]+D+1721086.5
ここで[]は高校数学で学ぶガウス記号で中身の数を超えない最大の整数を与える関数です。
Y, M, Dは現在の暦(グレゴリオ暦=西暦)での年月日ですが、1月、2月の場合はYをY-1、Mをそれぞれ13,14とします。
みてもらうと分かりますがかなり大きな値です。そのため基準を力学時2000年正午にしたものを天文学ではよく使います。これをJ2000.0と呼びます。その基準からの日数をしばしば大文字のKで表しJ2000.0からの経過ユリウス日数、それを1年分=365.25集めたものを大文字のTで表し経過ユリウス年(単にKを365.25で割っただけです)と呼びます。
力学時2000年1月1日正午から2000+Y年M月D日世界時0時までの経過日数K、経過年Tは次のように定義されます。
経過ユリウス日:K = 365Y + 30M + D – 33.5 + [3(M + 1)/5] + [Y / 4] —– (1)
経過ユリウス年:T = K / 365.25 —– (2)
このように算出したJ2000.0からの経過ユリウス年を使って年、月の干支を出し、経過ユリウス日を使って日干支を出します。
日干支は
([K] – 4) mod 60 —– (3)
ここで[]は再びガウス記号。modは60で割ったあまりの整数を与える関数です。処理系によって引数が負の数の場合の処理が違い、負の数を返却するものと正の数を返却するものがあります。負の数を返却する処理系の場合は結果に60を加える処理を追加する必要があります。ここは試すしかないでしょう。
年干支:([T] + 2000 – 3) mod 60 —– (4)
月干支:([T] * 12 + 15 + 2000 – 3) mod 60 —– (5)
J2000.0以前なら
年干支だけは:([T + 1] + 2000 – 4) mod 60 —– (4‘)
で計算する必要があります。意外に微妙なものですね。ガウス記号を使うので境界の年を正しく処理するためです。
要約すると
(1)->(2)->(3)で日干支
(1)->(2)->(5)で月干支
(1)->(2)->(4) or (4’)で年干支
です。
返却された数字を次のテーブルで干支に変換すればいいわけです。
1 |
甲子 |
13 |
丙子 |
25 |
戊子 |
37 |
庚子 |
49 |
壬子 |
2 |
乙丑 |
14 |
丁丑 |
26 |
己丑 |
38 |
辛丑 |
50 |
癸丑 |
3 |
丙寅 |
15 |
戊寅 |
27 |
庚寅 |
39 |
壬寅 |
51 |
甲寅 |
4 |
丁卯 |
16 |
己卯 |
28 |
辛卯 |
40 |
癸卯 |
52 |
乙卯 |
5 |
戊辰 |
17 |
庚辰 |
29 |
壬辰 |
41 |
甲辰 |
53 |
丙辰 |
6 |
己巳 |
18 |
辛巳 |
30 |
癸巳 |
42 |
乙巳 |
54 |
丁巳 |
7 |
庚午 |
19 |
壬午 |
31 |
甲午 |
43 |
丙午 |
55 |
戊午 |
8 |
辛未 |
20 |
癸未 |
32 |
乙未 |
44 |
丁未 |
56 |
己未 |
9 |
壬申 |
21 |
甲申 |
33 |
丙申 |
45 |
戊申 |
57 |
庚申 |
10 |
癸酉 |
22 |
乙酉 |
34 |
丁酉 |
46 |
己酉 |
58 |
辛酉 |
11 |
甲戌 |
23 |
丙戌 |
35 |
戊戌 |
47 |
庚戌 |
59 |
壬戌 |
12 |
乙亥 |
24 |
丁亥 |
36 |
己亥 |
48 |
辛亥 |
0 |
癸亥 |
もちろん、どの日時が月の始まりかは節入り日時で決まり、年の始めも年初の節入り日時で決まるのは言うまでもありません。万年暦を作成するためには節入り日時が必要になります。