暦アプリ作ってみようか 9 ~吉神:天恩日かどうか判定してみよう~
暦アプリを作るシリーズ、今回は「天恩日」かどうかの判定できるようにしていきたいと思います。
「天恩日」(てんおんにち・てんおんび)とは、「天の恩恵を全ての人が受ける日」、つまり「全ての人が天の恩恵を受けることで福が訪れる」とされる吉日だそうです。
この「天恩日」の決まり方も諸説あるとの事ですが、指定された15の干支日に当たる日を「天恩日」として返します。
なお、この「天恩日」ですが、基本的には5日連続して発生するのが特徴です。不成就日と天恩日が重なる場合、天恩日の表示をしないサイトもありますが、本プログラムでは不成就日と重なるかどうかのチェックはしていません。吉凶双方の情報を合わせて判断頂ければと思っています。
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
'母倉日(ぼそうにち)かどうかのチェック
' 母倉日チェックリスト
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
'天恩日かどうかのチェック
' 天恩日チェックリスト
Dim Tenonnichi() As String = {"甲子", "乙丑", "丙寅", "丁卯", "戊辰", "己卯", "庚辰", "辛巳", "壬午", "癸未", "己酉", "庚戌", "辛亥", "壬子", "癸丑"}
For i = 0 To 14
If Tenonnichi(i) = jikkan(jikkan_day_index) & jyuunishi(jyuunishi_day_index) Then
Tmp_Kichijin &= "天恩日 "
End If
Next
Return Tmp_Kichijin
End Function
関数Calc_Kichijinに任意の年月日を入力すると、「天恩日」であれば、戻り値の中に「天恩日」の文字が含まれています。
「天恩日」は不動産購入や引越しにも吉なのだそうです。本業の方でも天恩日を意識していこうと思っています。
引き続き暦アプリ作りは続きます。
つづく