暦アプリ作ってみようか 4 ~一粒万倍日、不成就日かどうか判定してみよう~
開運日、大凶日に関するWEBページを見ていると多く出てくるものに「一粒万倍日」や「不成就日」があります。
「一粒万倍日」は一粒万倍日は何事を始めるにも良い日とされ、特に仕事始め、開店、種まき、お金を出すことに吉であるとされ、借金をしたり人から物を借りたりすることは苦労の種が万倍になるため凶とされる日だそうです。
「不成就日」は何事も成就しない日とされ、結婚・開店・子供の命名・移転・契約・芸事始め・願い事など、事を起こすことが凶とされる日だそうです。
「一粒万倍日」も「不成就日」も日本独自のもののようですね。
今回は「一粒万倍日」と「不成就日」を判定してみましょう。
一粒万倍日かどうかをチェックする関数 Chk_Ichiryumanbaibi (VB.NET)のソースはこちらです。
Public Function Chk_Ichiryumanbaibi(calc_date As Date) As Boolean
' 十二支リスト
Dim jyuunishi() As String = {"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"}
' 日取りリスト
Dim Ichiryu_Eto_Day() 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 Left(Ichiryu_Eto_Day(lunar_month - 1), 1) = jyuunishi(jyuunishi_day_index) Or Right(Ichiryu_Eto_Day(lunar_month - 1), 1) = jyuunishi(jyuunishi_day_index) Then
Return True
Else
Return False
End If
End Function
Chk_Ichiryumanbaibiに任意の年月日を入れて実行すると、一粒万倍日であればTrue、そうでなければ False を返します。
色々な計算方法が存在するようですが、ここでは月干支と日干支の組み合わせで一粒万倍日かどうかを判定しています。ソースの一部にあまりキレイではない書き方をしている部分がありますが、そこはご容赦を・・・。
実際走らせてみると、開運日を扱ったサイトに載っている日じゃない日も一粒万倍日と判定していることに気づきます。
はて?
一粒万倍日は仏滅や不成就日、月破大耗の日でも存在する場合があります。どうやら、凶日が重なった場合、一粒万倍日ではないとしているようでした。
凶日が重なった場合、凶日を優先する考え方が一般的なようですが、どう扱うかは皆様にお任せすることとして、ここでは凶日と重なっても判定をFalseにせず機械的に計算しています。
面倒くさいからやらないのではなく、ちゃんと意識した上で凶日を優先していただきたいのです。
さて、今度は「不成就日」に移りましょう。
不成就日かどうかを判定する関数Chk_Fujyoujyubiのソースはこちらです。
Public Function Chk_Fujyoujyubi(Calc_Date As Date) As Boolean
' 日本の暦のカルチャーを使用して旧暦の日付を取得
Dim jpCalendar As New JapaneseLunisolarCalendar()
Dim lunar_year As Integer = jpCalendar.GetYear(Calc_Date)
Dim lunar_month As Integer = jpCalendar.GetMonth(Calc_Date)
Dim lunar_day As Integer = jpCalendar.GetDayOfMonth(Calc_Date)
Dim uruMonth As Integer = jpCalendar.GetLeapMonth(lunar_year, jpCalendar.GetEra(Calc_Date))
' 閏月を含む場合の月を補正
If uruMonth > 0 AndAlso lunar_month = uruMonth Then
lunar_month -= 1
End If
' 月ごとの不成就日を配列で定義
Dim fujyojyubiDays As Dictionary(Of Integer, Integer()) = New Dictionary(Of Integer, Integer()) From {
{1, New Integer() {3, 11, 19, 27}}, ' 1月
{2, New Integer() {2, 10, 18, 26}}, ' 2月
{3, New Integer() {1, 9, 17, 25}}, ' 3月
{4, New Integer() {4, 12, 20, 28}}, ' 4月
{5, New Integer() {5, 13, 21, 29}}, ' 5月
{6, New Integer() {6, 14, 22, 30}}, ' 6月
{7, New Integer() {3, 11, 19, 27}}, ' 7月
{8, New Integer() {2, 10, 18, 26}}, ' 8月
{9, New Integer() {1, 9, 17, 25}}, ' 9月
{10, New Integer() {4, 12, 20, 28}}, ' 10月
{11, New Integer() {5, 13, 21, 29}}, ' 11月
{12, New Integer() {6, 14, 22, 30}} ' 12月
}
' 該当する月と日にちが不成就日かどうかチェック
If fujyojyubiDays.ContainsKey(lunar_month) AndAlso fujyojyubiDays(lunar_month).Contains(lunar_day) Then
Return True
Else
Return False
End If
End Function
Chk_Fujyoujyubiに任意の年月日を入れて実行すると、不成就日であればTrue、そうでなければFalseを返します。
不成就日は旧暦を基に判定しています。旧暦の取得については、JapaneseLunisolarCalendarクラスを使っています。
月毎に不成就日である日にちが決まっています。
少しずつ関数が増えてきましたが、まだまだこれから。
ぼちぼち進んで行きます。
つづく