JapaneseLunisolarCalendar クラスは、太陰太陽暦を表す EastAsianLunisolarCalendar クラスから派生しています。EastAsianLunisolarCalendar クラスでは、太陽暦と、太陰太陽暦、年が時代 (年号) に関連付けられ 60 年周期を持つ暦、および年の任意の月の後に閏月を置くことができる暦との間の日付の変換がサポートされます。
閏月は、年の任意の月の後に置くことができます。たとえば、GetMonth メソッドは、特定の日付に関連付けられた月を示す 1 ~ 13 の範囲の数値を返します。閏月が 8 番目の月と 9 番目の月の間にある場合、GetMonth メソッドは、8 番目の月に 8 を返し、8 番目の閏月に 9 を返し、9 番目の月に 10 を返します。
現在、JapaneseLunisolarCalendar は CultureInfo クラスがサポートしているどのカルチャでも使用されていません。したがって、このクラスは、日本の太陰太陽暦での日付を計算するためだけに使用できます。
各 CultureInfo は一連の暦をサポートしています。Calendar プロパティは、カルチャの既定の暦を返し、OptionalCalendars プロパティは、そのカルチャがサポートしているすべての暦の配列を返します。CultureInfo が使用する暦を変更するには、CultureInfo.DateTimeFormat の Calendar プロパティを新しい Calendar に設定します。
ということで、サンプルもいただいてしまったので、早速つかってみたw
以下の、WinFormアプリを作成。
お待ちかねのコードはこちら(なぜか VB)
Public Class Form1
' カレンダーの日付を選択した時のイベントハンドラ
Private Sub MonthCalendar1_DateChanged(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged
TextBox1.Text = e.Start.ToLongDateString()
TextBox2.Text = SetJapaneseLunisolar(e.Start)
End Sub
'JapaneseLunisolarCalendar(日本の太陰太陽暦=旧暦)
Function SetJapaneseLunisolar(ByVal selectDay As Date) As String
Dim jpnOldDays As Globalization.JapaneseLunisolarCalendar _
= New Globalization.JapaneseLunisolarCalendar
Dim oldMonth As Integer = jpnOldDays.GetMonth(selectDay) '旧暦の月を取得
Dim oldDay As Integer = jpnOldDays.GetDayOfMonth(selectDay) '旧暦の日を取得
'閏月を取得
Dim uruMonth As Integer = _
jpnOldDays.GetLeapMonth(jpnOldDays.GetYear(selectDay), _
jpnOldDays.GetEra(selectDay))
'閏月がある場合の旧暦月の補正
If (uruMonth > 0) And (oldMonth - uruMonth >= 0) Then
oldMonth = oldMonth - 1 '旧暦月の補正
End If
'六曜を求める
Dim rokuyo As Integer = (oldMonth + oldDay) Mod 6
Dim rokuyoString As String = ""
Select Case rokuyo
Case 0
rokuyoString = "大安"
Case 1
rokuyoString = "赤口"
Case 2
rokuyoString = "先勝"
Case 3
rokuyoString = "友引"
Case 4
rokuyoString = "先負"
Case 5
rokuyoString = "仏滅"
End Select
Return oldMonth & "月" & oldDay & "日" & "(閏月)" & uruMonth & " 六曜" & rokuyoString
End Function
End Class
C#の例(VBを置き換えただけ・・・)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
namespace JapaneseLunisolarCalendarWinCS
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void monthCalendar1_DateChanged(object sender,
DateRangeEventArgs e)
{
textBox1.Text = e.Start.ToLongDateString();
textBox2.Text = SetJapaneseLunisolar(e.Start);
}
//JapaneseLunisolarCalendar(日本の太陰太陽暦=旧暦)
private string SetJapaneseLunisolar(DateTime selectDay)
{
JapaneseLunisolarCalendar jpnOldDays =
new JapaneseLunisolarCalendar();
int oldMonth = jpnOldDays.GetMonth(selectDay); //旧暦の月を取得
int oldDay = jpnOldDays.GetDayOfMonth(selectDay);//旧暦の日を取得
//閏月を取得
int uruMonth = jpnOldDays.GetLeapMonth(
jpnOldDays.GetYear(selectDay),
jpnOldDays.GetEra(selectDay));
//閏月がある場合の旧暦月の補正
if ((uruMonth > 0) && (oldMonth - uruMonth >= 0))
{
oldMonth = oldMonth - 1; //旧暦月の補正
}
//六曜を求める
int rokuyo = (oldMonth + oldDay) % 6;
string rokuyoString = "";
switch (rokuyo)
{
case 0:
rokuyoString = "大安";
break;
case 1:
rokuyoString = "赤口";
break;
case 2:
rokuyoString = "先勝";
break;
case 3:
rokuyoString = "友引";
break;
case 4:
rokuyoString = "先負";
break;
case 5:
rokuyoString = "仏滅";
break;
default:
rokuyoString = "";
break;
}
return oldMonth.ToString() + "月"
+ oldDay.ToString() + "日"
+ "(閏月)" + uruMonth.ToString()
+ " 六曜 " + rokuyoString;
}
}
}
たったこれだけっす!