【C#】西暦(DateTime)を和暦の元号と年に変換する方法

目次

西暦から和暦(元号)への変換

C#で日付を扱うDateTime構造体は、標準でグレゴリオ暦(西暦)を使用しています。しかし、日本のアプリケーションでは、"2025/11/20"のような西暦を、"令和7年"のような和暦(元号と年)の形式で扱いたい場合があります。

System.Globalization名前空間には、日本のカレンダー(和暦)を扱うためのJapaneseCalendarクラスや、CultureInfo(カルチャ)が用意されています。

この記事では、DateTimeオブジェクトから和暦の「年」と「元号」を取得する、2つの主要なアプローチについて解説します。


1. 書式指定による変換(ToStringCultureInfo

最も簡単で一般的な方法は、ToStringメソッドの書式指定と、日本のカルチャ情報(ja-JP)を組み合わせる方法です。

CultureInfo("ja-JP")(日本語カルチャ)を指定してToStringを呼び出すと、"gg"書式指定子が元号(例: “令和”)に自動的に変換されます。

書式指定説明出力例(2025/11/20)
ggyy年元号 + 2桁の年 (0埋め)令和07年
gg y年元号 + 年令和 7年

コード例(ToString

using System;
using System.Globalization; // CultureInfo を使用するために必要

public class WarekiFormatExample
{
    public static void Main()
    {
        // 変換対象の日付 (西暦)
        DateTime targetDate = new DateTime(2025, 11, 20);

        // 日本のカルチャ情報を指定
        CultureInfo japaneseCulture = new CultureInfo("ja-JP");

        // "gg" で元号、 "y" または "yy" で年 を指定
        string warekiString1 = targetDate.ToString("ggyy年M月d日", japaneseCulture);
        string warekiString2 = targetDate.ToString("gg y年", japaneseCulture);

        Console.WriteLine($"元の西暦: {targetDate:yyyy/MM/dd}");
        Console.WriteLine($"和暦 (ggyy年): {warekiString1}");
        Console.WriteLine($"和暦 (gg y年): {warekiString2}");
    }
}

出力結果:

元の西暦: 2025/11/20
和暦 (ggyy年): 令和07年11月20日
和暦 (gg y年): 令和 7年

2. JapaneseCalendarクラスによる計算

書式設定された文字列ではなく、「元号」や「和暦の年」を数値や個別のデータとして取得し、計算に使用したい場合は、JapaneseCalendarクラスを使用します。

  • calendar.GetYear(DateTime date):DateTimeに対応する和暦の**年(数値)**を返します。(例: 2025年 -> 7)
  • calendar.GetEra(DateTime date):DateTimeに対応する元号の**インデックス(数値)**を返します。(例: 令和 -> 5)

元号インデックスから元号名を取得する

GetEraが返すのは "令和" という文字列ではなく、単なるインデックス番号(int)です。このインデックス番号を元号名(”令和”など)に変換するには、CultureInfoDateTimeFormat.GetEraName()メソッドを使用します。

コード例(JapaneseCalendar

JapaneseCalendarを使用して、DateTimeから「令和」という文字列と「7」という数値を個別に取得する例です。

using System;
using System.Globalization; // JapaneseCalendar, CultureInfo のため

public class JapaneseCalendarExample
{
    public static void Main()
    {
        // 変換対象の日付 (西暦)
        DateTime targetDate = new DateTime(2025, 11, 20);

        // 1. JapaneseCalendar のインスタンスを作成
        var calendar = new JapaneseCalendar();
        
        // 2. 日本のカルチャ情報を取得 (元号名の変換に使う)
        var culture = new CultureInfo("ja-JP");
        
        // 元号名を取得するために、カレンダーを JapaneseCalendar に設定
        culture.DateTimeFormat.Calendar = calendar;

        // 3. 和暦の「年」を数値 (int) として取得
        int eraYear = calendar.GetYear(targetDate); // 7

        // 4. 元号の「インデックス」を数値 (int) として取得
        int eraIndex = calendar.GetEra(targetDate); // 5 (令和)

        // 5. 元号インデックスを元号名 (string) に変換
        string eraName = culture.DateTimeFormat.GetEraName(eraIndex); // "令和"

        Console.WriteLine($"西暦: {targetDate:yyyy/MM/dd}");
        Console.WriteLine("--- JapaneseCalendar による分離 ---");
        Console.WriteLine($"元号名 (string): {eraName}");
        Console.WriteLine($"和暦年 (int): {eraYear}");
        Console.WriteLine($"(参考)元号インデックス: {eraIndex}");
    }
}

出力結果:

西暦: 2025/11/20
--- JapaneseCalendar による分離 ---
元号名 (string): 令和
和暦年 (int): 7
(参考)元号インデックス: 5

まとめ

C#で西暦を和暦に変換する方法は、目的に応じて使い分けます。

  • 単純に「令和7年」のような文字列が欲しい場合:dateTime.ToString(“ggyy年”, new CultureInfo(“ja-JP”)) を使用するのが最も簡単です。
  • 「令和」という元号名と「7」という年を別々に取得して計算などに使いたい場合:JapaneseCalendarクラスのGetYearとGetEraを使用し、CultureInfoで元号名を解決します。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次