見出し画像

暦アプリ作ってみようか 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()のデータの一部に誤りがありました。
訂正を行いました。


いいなと思ったら応援しよう!