見出し画像

暦アプリ作ってみようか 2 ~凶神:月破大耗の日かどうか判定してみよう~

任意の年月日の干支を算出できるようになりましたので、早速いろいろと判定させていきたいと思います。

第一弾は大凶日とされる「月破大耗」(げっぱたいもう)の日かどうか?です。

月破大耗はほぼ万事において凶とされる日です。古い家屋の解体などは例外的に吉だそうです。

月破大耗かどうかは任意の年月日における干支月の干支と干支日の干支が真っ向から対立した日であるかどうかで判定できます。

子月・・・午日
丑月・・・未日
寅月・・・申日
卯月・・・酉日
辰月・・・戌日
巳月・・・亥日
午月・・・子日
未月・・・丑日
申月・・・寅日
酉月・・・卯日
戌月・・・辰日
亥月・・・巳日

すでに任意の年月日の干支は算出できますので余裕ですね。
今後の事も考えて、吉神、凶神に分けて任意の年月日がどんな日であるか文字列で返す関数として作成していきます。

今回の月破大耗判定ロジックを織り込んだFuction Calc_Kyojin (VB.NET) はこちらです。前回作成した関数も使います。

    Public Function Calc_Kyojin(calc_date As Date) As String

        Dim Tmp_Kyojin As String = ""

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


        ' 月破大耗チェックリスト
        Dim Geppa() 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 &= "月破大耗 "



        Return Tmp_Kyojin

    End Function

Calc_Kyojinに任意の年月日を入力すると、その日が月破大耗の日であれば、戻り値の中に「月破大耗」の文字が並びます。

今度は吉神側の関数を作っていくことにしたいと思います。バランスをとりながら少しずつ作り進めることといたしましょう。

つづく

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