西暦から和暦(元号)文字列への変換
C#で日付を扱うDateTimeオブジェクトは、標準ではグレゴリオ暦(西暦)に基づいています。しかし、日本の業務アプリケーションや帳票印刷などでは、"2025/11/20"のような西暦表記ではなく、"令和7年11月20日"といった和暦(元号)表記が求められる場面が数多くあります。
C#では、System.Globalization名前空間にあるCultureInfoクラスとJapaneseCalendarクラス、そしてDateTime.ToStringメソッドのカスタム書式指定子を組み合わせることで、この和暦変換を実現できます。
準備:CultureInfoとJapaneseCalendar
DateTime.ToStringメソッドは、デフォルトでは実行環境のOSのカルチャ(地域設定)に基づいて文字列を生成します。和暦文字列を確実に生成するには、「日本のカレンダー(JapaneseCalendar)を使用する、日本語(ja-JP)のカルチャ情報」を明示的に指定する必要があります。
以下のコードは、和暦変換用のCultureInfoインスタンスを準備する定型的な方法です。
using System;
using System.Globalization; // 必須
// 1. "ja-JP" (日本語-日本) のカルチャ情報を生成
var japanCulture = new CultureInfo("ja-JP", true);
// 2. このカルチャの日付書式が「和暦」を使用するように設定
japanCulture.DateTimeFormat.Calendar = new JapaneseCalendar();
このjapanCultureオブジェクトをToStringメソッドの引数として渡すことで、和暦変換が有効になります。
和暦用のカスタム書式指定子
ToStringメソッドで和暦を使用する場合、以下のカスタム書式指定子が重要な役割を果たします。
| 指定子 | 説明 |
gg | 元号の省略名(例: 平成、令和)を出力します。 |
y | 和暦における年(1~)を出力します。 |
yy | 和暦における年を0埋め2桁(01, 07, 31など)で出力します。 |
これらをMM(月)やdd(日)と組み合わせることで、任意の和暦書式を作成できます。
コード例:ToStringによる和暦変換
準備したjapanCultureオブジェクトをToStringメソッドの第2引数に渡して、西暦の日付を和暦文字列に変換します。
コード例1:標準的な和暦フォーマット
ggyy年MM月dd日のような、0埋めありの書式で出力する例です。
using System;
using System.Globalization;
public class WarekiFormatExample
{
public static void Main()
{
// 和暦変換用のカルチャを準備
var japanCulture = new CultureInfo("ja-JP", true);
japanCulture.DateTimeFormat.Calendar = new JapaneseCalendar();
// 変換対象の西暦日付 (令和7年)
DateTime targetDate = new DateTime(2025, 11, 20);
// ggyy: 元号 + 0埋め2桁の年
// MM: 0埋め2桁の月
// dd: 0埋め2桁の日
string format1 = "ggyy年MM月dd日";
string warekiString1 = targetDate.ToString(format1, japanCulture);
Console.WriteLine($"西暦: {targetDate:yyyy-MM-dd}");
Console.WriteLine($"書式 '{format1}': {warekiString1}");
// 0埋めしない場合 (gg y年M月d日)
string format2 = "gg y年M月d日";
string warekiString2 = targetDate.ToString(format2, japanCulture);
Console.WriteLine($"書式 '{format2}': {warekiString2}");
}
}
出力結果:
西暦: 2025-11-20
書式 'ggyy年MM月dd日': 令和07年11月20日
書式 'gg y年M月d日': 令和 7年11月20日
コード例2:元号の切り替わり日(平成から令和へ)
JapaneseCalendarは元号の切り替わりを正しく認識します。
using System;
using System.Globalization;
public class EraChangeExample
{
public static void Main()
{
var japanCulture = new CultureInfo("ja-JP", true);
japanCulture.DateTimeFormat.Calendar = new JapaneseCalendar();
string format = "ggyy年M月d日 (dddd)"; // 曜日(dddd)も追加
// 平成の最後の日
DateTime heiseiEnd = new DateTime(2019, 4, 30);
Console.WriteLine(heiseiEnd.ToString(format, japanCulture));
// 令和の最初の日
DateTime reiwaStart = new DateTime(2019, 5, 1);
Console.WriteLine(reiwaStart.ToString(format, japanCulture));
}
}
出力結果:
平成31年4月30日 (火曜日)
令和01年5月1日 (水曜日)
“令和元年”は、yy(2桁)指定では01年として表現されます。
まとめ
C#でDateTime(西暦)を和暦文字列に変換するには、string.ToStringメソッドを使用します。
new CultureInfo("ja-JP")を作成します。- そのカルチャの
DateTimeFormat.Calendarにnew JapaneseCalendar()を設定します。 ToStringメソッドの書式指定子に"gg"(元号)と"y"または"yy"(和暦年)を含めます。ToStringの第2引数に、準備したCultureInfoオブジェクトを渡します。
この手順により、DateTimeオブジェクトを日本の商慣習に合った和暦文字列として正確にフォーマットできます。
