DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

干支を取得する

ここでは、指定した年の干支(六十干支十干十二支)を取得する方法を紹介します。

JapaneseLunisolarCalendarを使う

.NET Framework 2.0以降では、和暦、太陰太陽暦(旧暦)の計算に対応したJapaneseLunisolarCalendarクラスを使用出来ます。JapaneseLunisolarCalendarクラスのGetSexagenaryYearメソッドで六十干支(十干十二支、天干地支)を、GetCelestialStemメソッドで十干(天干)を、GetTerrestrialBranchメソッドで十二支(地支)を取得できます。

これらのメソッドは整数を返します。GetSexagenaryYearメソッドは1から60の整数を返し、1は甲子に60は癸亥に対応しています。GetCelestialStemメソッドは1から10の整数を返し、1は甲に10は癸に対応しています。GetTerrestrialBranchメソッドは1から12の整数を返し、1は子に12は亥に対応しています。

VB.NET
コードを隠すコードを選択
Dim dt As New DateTime(2000, 8, 1)

'JapaneseLunisolarCalendarオブジェクトを作成する
Dim jlc As New System.Globalization.JapaneseLunisolarCalendar()
'六十干支を取得する
Dim sexagenaryYear As Integer = jlc.GetSexagenaryYear(dt)
'十干を取得する
Dim celestialStem As Integer = jlc.GetCelestialStem(sexagenaryYear)
'十二支を取得する
Dim terrestrialBranch As Integer = jlc.GetTerrestrialBranch(sexagenaryYear)

'結果を表示する
Console.WriteLine("干支:{0} / 十干:{1} / 十二支:{2}", _
    sexagenaryYear, celestialStem, terrestrialBranch)
'干支:17 / 十干:7 / 十二支:5
C#
コードを隠すコードを選択
DateTime dt = new DateTime(2000, 8, 1);

//JapaneseLunisolarCalendarオブジェクトを作成する
System.Globalization.JapaneseLunisolarCalendar jlc =
    new System.Globalization.JapaneseLunisolarCalendar();
//六十干支を取得する
int sexagenaryYear = jlc.GetSexagenaryYear(dt);
//十干を取得する
int celestialStem = jlc.GetCelestialStem(sexagenaryYear);
//十二支を取得する
int terrestrialBranch = jlc.GetTerrestrialBranch(sexagenaryYear);

//結果を表示する
Console.WriteLine("干支:{0} / 十干:{1} / 十二支:{2}",
    sexagenaryYear, celestialStem, terrestrialBranch);
//干支:17 / 十干:7 / 十二支:5

JapaneseLunisolarCalendarは太陰太陽暦で計算するため、干支が変わるのは1月1日ではなく、2月ごろになるようです。

自分で計算する

自分で計算しても難しくはないです。

以下に、指定した年(西暦)の干支を返すメソッドの例を示します。「干支 - Wikipedia」で紹介されている方法を使って計算しています。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 指定した年の十干(天干)を取得する。
''' </summary>
''' <param name="year">西暦の年。</param>
''' <returns>指定した年の干を示す1文字。</returns>
Public Shared Function GetKan(ByVal year As Integer) As Char
    Const jikkan As String = "庚辛壬癸甲乙丙丁戊己"
    Return jikkan(year Mod 10)
End Function

''' <summary>
''' 指定した年の十二支(地支)を取得する。
''' </summary>
''' <param name="year">西暦の年。</param>
''' <returns>指定した年の支を示す1文字。</returns>
Public Shared Function GetShi(ByVal year As Integer) As Char
    Const juunishi As String = "申酉戌亥子丑寅卯辰巳午未"
    Return juunishi(year Mod 12)
End Function

''' <summary>
''' 指定した年の干支(六十干支、十干十二支、天干地支)を取得する。
''' </summary>
''' <param name="year">西暦の年。</param>
''' <returns>指定した年の干支を示す2文字。</returns>
Public Shared Function GetEto(ByVal year As Integer) As String
    Return New String(New Char() {GetKan(year), GetShi(year)})
End Function
C#
コードを隠すコードを選択
/// <summary>
/// 指定した年の十干(天干)を取得する。
/// </summary>
/// <param name="year">西暦の年。</param>
/// <returns>指定した年の干を示す1文字。</returns>
public static char GetKan(int year)
{
    const string jikkan = "庚辛壬癸甲乙丙丁戊己";
    return jikkan[year % 10];
}

/// <summary>
/// 指定した年の十二支(地支)を取得する。
/// </summary>
/// <param name="year">西暦の年。</param>
/// <returns>指定した年の支を示す1文字。</returns>
public static char GetShi(int year)
{
    const string juunishi = "申酉戌亥子丑寅卯辰巳午未";
    return juunishi[year % 12];
}

/// <summary>
/// 指定した年の干支(六十干支、十干十二支、天干地支)を取得する。
/// </summary>
/// <param name="year">西暦の年。</param>
/// <returns>指定した年の干支を示す2文字。</returns>
public static string GetEto(int year)
{
    return new string(new char[] { GetKan(year), GetShi(year) });
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。