和暦表示
C#(.NET)標準で和暦表示が可能だが、略号のアルファベット1文字の表示機能は無い
平成・令和等でも良いが、スペースが限られている場合等、H・R等1文字で表示したい
目標
- DateTimeで和暦表示(アルファベット1文字)をする
- 今後追加される年号にも対応する
- 内部に対応表を持たない(プログラム変更不要)
- 外部ファイルに対応表を持たない(ユーザー修正不要)
コード
public static class DateTimeEx
{
/// <summary>和暦カルチャ</summary>
static readonly CultureInfo JP_CULTURE = new("ja-JP");
/// <summary>元号の短縮形マップ</summary>
static readonly Dictionary<string, char> ERA_ALPHA = [];
static DateTimeEx()
{
JP_CULTURE.DateTimeFormat.Calendar = new JapaneseCalendar();
for (var c = 'A'; c <= 'Z'; c++)
{
var eraIndex = JP_CULTURE.DateTimeFormat.GetEra(c.ToString());
if (eraIndex < 0) continue;
var eraName = JP_CULTURE.DateTimeFormat.GetEraName(eraIndex);
ERA_ALPHA[eraName] = c;
}
}
/// <summary>元号の短縮形を返します</summary>
public static char GetEraAlpha(this string era) =>
ERA_ALPHA.TryGetValue(era, out var result) ? result : '?';
/// <summary>西暦(和暦短縮形)の形式で年を返します</summary>
public static string ToEraYearString(this DateTime date)
{
var eraName = GetEraAlpha(date.ToString("gg", JP_CULTURE));
var eraYear = int.Parse(date.ToString("yy", JP_CULTURE));
return $"{date.Year}({eraName}){eraYear}";
}
}
元号の更新について(Copilotによる)
✔️ .NET Framework 4.x / .NET Core(Windows上)
- 元号情報は Windows のレジストリから取得されます 1。
- 新しい元号(例:令和)が追加された場合、Windows Update によってレジストリが更新されることで .NET も自動的に対応します。
- アプリ側で .NET を更新する必要は基本的にありません。
✔️ .NET Framework 3.5(古いバージョン)
- 元号情報は .NET 内部にハードコードされていました。
- ただし、更新によりレジストリ参照に切り替えられたため、Windowsの更新で対応可能になります 1。
✔️ .NET Core / .NET 5+(非Windows環境)
- 元号情報は ICU(International Components for Unicode)ライブラリに依存します。
- 新元号に対応するには、ICUライブラリの更新が必要です。
まとめ
- Windows環境であれば、OSを最新に保つことが最も重要です。
- アプリや .NET ランタイムの更新は基本的に不要ですが、古い環境(.NET 3.5など)では注意が必要です。
- 非Windows環境では、ICUの更新状況を確認する必要があります。