見出し画像

暦アプリ作ってみようか 7 ~十二直を判定したら建除十二神も判明した、そして・・・~

今回は十二直を計算してみたいと思います。

十二直とは、中国の北斗七星信仰に由来した、一日の吉凶を占う暦注です。古代中国では、北斗七星の柄杓の指す向きが違うことから、それぞれの方角に十二支を割り当て、吉凶判断を行うようになったそうです。

十二直の計算は、月の干支と日の干支を用いて計算します。
VB.NETのソースはこちらです

    ' 二十四節気の計算に基づき、十二直を算出する関数
    Public Function Calc_jyunichoku(calc_date As Date) As String
        ' 十二直の一覧
        Dim jyunichokuList 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 jyuunishi_day_index As Integer = days_diff Mod 12

        ' 十二直の計算
        Dim jyunichoku_index As Integer = jyuunishi_day_index - (lunar_month - 1)
        If jyunichoku_index < 0 Then jyunichoku_index += 12

        ' 計算された十二直を返す
        Return jyunichokuList(jyunichoku_index)

    End Function

Calc_jyunichokuに任意の年月日を入力すると、十二直が返されます。

十二直が求められると、「建除十二神」も定まるということで、吉神・凶神判定プログラムにも「建除十二神」を返すロジックを追加します。

まずは吉神から

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

    '母倉日(ぼそうにち)かどうかのチェック
    ' 母倉日チェックリスト
    Dim Bosounichi() As String = {"申酉", "申酉", "亥子", "亥子", "亥子", "寅卯", "寅卯", "寅卯", "辰戌丑未", "辰戌丑未", "辰戌丑未", "申酉"}
    Dim Flag_Bosounichi As Boolean = False

    For i As Integer = 1 To Len(Bosounichi(lunar_month - 1))
        If Mid(Bosounichi(lunar_month - 1), i, 1) = jyuunishi(jyuunishi_day_index) Then Flag_Bosounichi = True
    Next

    '各季節の土用の巳・午の日も母倉日
    Dim Chk_Doyou As Integer = 0
    For i = 0 To 3
        Chk_Doyou = (calc_date - solar_terms(3 * i + 2)).Days
        If Chk_Doyou >= -18 And Chk_Doyou < 0 Then
            If jyuunishi(jyuunishi_day_index) = "巳" Or jyuunishi(jyuunishi_day_index) = "午" Then
                Flag_Bosounichi = True
            End If
        End If
    Next

    If Flag_Bosounichi = True Then
        Tmp_Kichijin &= "母倉日(ぼそうにち) "
    End If

    '建除十二神のうち、吉神をチェック
    Select Case Calc_jyunichoku(calc_date)
        Case "建"
            Tmp_Kichijin &= "兵福 "
        Case "除"
            Tmp_Kichijin &= "兵寶 "
        Case "満"
            Tmp_Kichijin &= "天巫 福徳 "
        Case "成"
            Tmp_Kichijin &= "天喜 "
        Case "開"
            Tmp_Kichijin &= "生気 "
        Case "閉"
            Tmp_Kichijin &= "天医 "
    End Select


    Return Tmp_Kichijin

End Function

続いて凶神側

    Public Function Calc_Kyojin(calc_date As Date) As String

        Dim Tmp_Kyojin As String = ""

        ' 十二支リスト
        Dim jyuunishi() As String = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}


        ' 月破大耗チェックリスト
        Dim Geppa() As String = {"午", "未", "申", "酉", "戌", "亥", "子", "丑", "寅", "卯", "辰", "巳"}

        ' 受死日チェックリスト
        Dim Jyushibi() 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 jyuunishi_day_index As Integer = days_diff Mod 12

        '月破大耗かどうかのチェック
        If jyuunishi(jyuunishi_day_index) = Geppa(lunar_month - 1) Then Tmp_Kyojin &= "月破大耗 "

        '月建かどうかのチェック
        If jyuunishi(jyuunishi_day_index) = jyuunishi(lunar_month - 1) Then Tmp_Kyojin &= "月建 "

        '受死日(じゅしび)かどうかのチェック
        If jyuunishi(jyuunishi_day_index) = Jyushibi(lunar_month - 1) Then Tmp_Kyojin &= "受死日 "

        '建除十二神のうち、凶神をチェック
        Select Case Calc_jyunichoku(calc_date)
            Case "建"
                Tmp_Kyojin &= "土府 "
            Case "満"
                Tmp_Kyojin &= "天狗 "
            Case "平"
                Tmp_Kyojin &= "死神 "
                Select Case lunar_month
                    Case 1, 3, 5, 7, 9, 11
                        Tmp_Kyojin &= "天罡(てんこう) "
                    Case 2, 4, 6, 8, 10, 12
                        Tmp_Kyojin &= "河魁(かかい) "
                End Select
            Case "定"
                Tmp_Kyojin &= "時陰 "
            Case "執"
                Tmp_Kyojin &= "小耗 "
            Case "収"
                Select Case lunar_month
                    Case 1, 3, 5, 7, 9, 11
                        Tmp_Kyojin &= "河魁(かかい) "
                    Case 2, 4, 6, 8, 10, 12
                        Tmp_Kyojin &= "天罡(てんこう) "
                End Select
            Case "閉"
                Tmp_Kyojin &= "血支 "
        End Select

        Return Tmp_Kyojin

    End Function

こちらの凶神側ですが、実はしれっと「月建」と「受死日」かどうかの判定も追加しています。こちらも月の干支と日の干支が分かればすぐに判定ができるものです。

凶神側なのでサラッといきましょう。

少しずつ増えてきましたが、まだまだ道半ば。次は何を判定させようかな・・・

つづく。

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