#設定はどこにあるのか
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
ここにあります。
.NET Framework 3.5 ではハードコードされた元号が使われていましたが、レジストリを参照するように統一されました。その他の対応も含め、詳しいことは以下の記事に書いてあります。
新元号への対応について
#PowerShell で和暦を表示
$culture = New-Object cultureinfo("ja-JP")
$culture.DateTimeFormat.Calendar = New-Object System.Globalization.JapaneseCalendar
$date = Get-Date
$date.ToString("ggyy年MM月dd日", $culture)
PowerShell で上記を実行すると 令和元年05月01日
のように表示されます。3行目では現在の日付を取得していますが、任意の日付を表示する場合は $date = [datetime]"2019-05-01"
のように指定します。
#仮定義による表示の違い
過去の記事につき折りたたんでいます。
April 2018 Update で新しい元号が入る場所には仮の値が追加されました。
このため、レジストリを参照するコントロールや .NET Framework 4 以降などは影響を受けます。
更新プログラム KB4458469 により仮定義が削除されました。引き続き検証が必要な場合は、手動でレジストリに仮の値を追加することができます。October 2018 Update も仮定義が含まれない状態で出荷されています。
Windows 10 Version 1803 における新元号の仮定義の削除について
仮定義 ??_?_??????_?
を追加して、どのように表示が変わるのかを比較してみました。
それぞれの環境で JapaneseCalendar クラスを使った同じプログラムを実行しています。
仮定義なし | |
---|---|
仮定義あり 「元年」の更新プログラム適用前 |
仮定義あり 「元年」の更新プログラム適用後 |
2019年5月1日以降の元号は「??」に置き換わっています。
また、仮定義がある状態で特定の更新プログラムが適用されていれば「??01年」の部分が「??元年」と表示されるようになっています。以前のように「1年」と出力させることも可能です。設定方法はフレームワークによって異なりますので、以下の記事をご覧ください。
Handling a new era in the Japanese calendar in .NET
使用したソースコードは以下のとおりです。
using System;
using System.Globalization;
internal class Program
{
private static void Main()
{
var culture = new CultureInfo("ja-JP")
{
DateTimeFormat = { Calendar = new JapaneseCalendar() }
};
var year = new DateTime(2015, 01, 01);
var date = new DateTime(2019, 04, 26);
for (var i = 0; i < 10; i++)
{
Console.Write(year.ToString("yyyy年") + "\t");
Console.Write(year.ToString("ggyy年", culture) + "\t");
Console.WriteLine(date.ToString("ggyy年MM月dd日", culture));
year = year.AddYears(1);
date = date.AddDays(1);
}
Console.WriteLine();
}
}
#参考情報
2019 年 5 月の新元号への変更に関する更新 | Microsoft サポート
https://support.microsoft.com/ja-jp/help/4470918/updates-for-may-2019-japan-era-change
Japan New Era Name Support Blog | 日本マイクロソフトの新元号 (和暦) 対応に関するサポート情報のブログ
https://blogs.technet.microsoft.com/jperablog/