暦アプリ作ってみようか 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
こちらの凶神側ですが、実はしれっと「月建」と「受死日」かどうかの判定も追加しています。こちらも月の干支と日の干支が分かればすぐに判定ができるものです。
凶神側なのでサラッといきましょう。
少しずつ増えてきましたが、まだまだ道半ば。次は何を判定させようかな・・・
つづく。