暦アプリ作ってみようか 3 ~吉神:天赦日かどうか判定してみよう~
今回は吉神側、天赦日(てんしゃび)であるかどうかの判定を行っていきたいと思います。
天赦日とは、天の生気が万物を養い、すべてを赦す(ゆるす)最良の日だそうです。
天赦日は季節毎に日が決められています。
春(立春から立夏の前日まで)「戊寅」の日
夏(立夏から立秋の前日まで)「甲午」の日
秋(立秋から立冬の前日まで)「戊申」の日
冬(立冬から立春の前日まで)「甲子」の日
これをプログラムに組み込む訳ですが、月と日の干支が分かればすぐに計算できます。今回はFunction Calc_Kichijinにて判定させるようにしています。ソースは引き続きVB.NET、これまでの連載で作成した関数を使用します。
Public Function Calc_Kichijin(calc_date As Date) As String
Dim Tmp_Kichijin As String = ""
' 十干リスト
Dim jikkan() As String = {"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"}
' 十二支リスト
Dim jyuunishi() As String = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}
' 24節気のうち、節月の開始日を示す節気の日付を計算
Dim solar_terms As New Dictionary(Of Integer, Date) From {
{1, calc_solar_term(calc_date.Year - 1, 23, 285)}, ' 小寒
{2, calc_solar_term(calc_date.Year, 1, 315)}, ' 立春
{3, calc_solar_term(calc_date.Year, 3, 345)}, ' 啓蟄
{4, calc_solar_term(calc_date.Year, 5, 15)}, ' 清明
{5, calc_solar_term(calc_date.Year, 7, 45)}, ' 立夏
{6, calc_solar_term(calc_date.Year, 9, 75)}, ' 芒種
{7, calc_solar_term(calc_date.Year, 11, 105)}, ' 小暑
{8, calc_solar_term(calc_date.Year, 13, 135)}, ' 立秋
{9, calc_solar_term(calc_date.Year, 15, 165)}, ' 白露
{10, calc_solar_term(calc_date.Year, 17, 195)}, ' 寒露
{11, calc_solar_term(calc_date.Year, 19, 225)}, ' 立冬
{12, calc_solar_term(calc_date.Year, 21, 255)} ' 大雪
}
' 月の干支の計算(24節気の節日で切替)
Dim lunar_month As Integer = 1
For i As Integer = 1 To 12
If calc_date >= solar_terms(i) Then
lunar_month = i + 1
Else
Exit For
End If
Next
If lunar_month = 13 Then lunar_month = 1
' 日の干支の計算
' 基準日を甲子日(1873/1/12)とし、その日からの経過日数を利用
Dim base_date As Date = CDate("1873/1/12") ' 甲子の日
Dim days_diff As Integer = (calc_date - base_date).Days
Dim jikkan_day_index As Integer = days_diff Mod 10
Dim jyuunishi_day_index As Integer = days_diff Mod 12
'天赦日かどうかのチェック
' 天赦日チェックリスト
Dim Tensyanichi() As String = {"甲子", "甲子", "戊寅", "戊寅", "戊寅", "甲午", "甲午", "甲午", "戊申", "戊申", "戊申", "甲子"}
If Tensyanichi(lunar_month - 1) = jikkan(jikkan_day_index) & jyuunishi(jyuunishi_day_index) Then
Tmp_Kichijin &= "天赦日 "
End If
Return Tmp_Kichijin
End Function
Calc_Kichijinに任意の年月日を入れて実行すると、その日が天赦日であれば戻り値の文字列の中に「天赦日」が含まれるようになります。
引き続き、判定する日を増やしていきます。
つづく
2024.9.10 追記
プログラムソース中、Tensyanichi()のデータの一部に誤りがありました。
訂正を行いました。