西暦から和暦(元号)への変換
C#で日付を扱うDateTime構造体は、標準でグレゴリオ暦(西暦)を使用しています。しかし、日本のアプリケーションでは、"2025/11/20"のような西暦を、"令和7年"のような和暦(元号と年)の形式で扱いたい場合があります。
System.Globalization名前空間には、日本のカレンダー(和暦)を扱うためのJapaneseCalendarクラスや、CultureInfo(カルチャ)が用意されています。
この記事では、DateTimeオブジェクトから和暦の「年」と「元号」を取得する、2つの主要なアプローチについて解説します。
1. 書式指定による変換(ToStringとCultureInfo)
最も簡単で一般的な方法は、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)です。このインデックス番号を元号名(”令和”など)に変換するには、CultureInfoのDateTimeFormat.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で元号名を解決します。
