目的
Windows 10 のレジストリに、元号ごとの開始日付や名称が登録されていますが、新元号が登録された場合の和暦から西暦への変換を試してみました。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras
"1868 01 01"="明治_明_Meiji_M"
"1912 07 30"="大正_大_Taisho_T"
"1926 12 25"="昭和_昭_Showa_S"
"1989 01 08"="平成_平_Heisei_H"
前提
新元号が設定された想定で、レジストリに下記文字列値を追加しました。
"2019 05 01"="ふが_ふ_Fuga_F"
確認
下記プログラムをVisual Basic(Visual Studio 2017 + .NET 4.5.2)で作成しました。
最近は Visual Basic ".NET" って呼ばないのか…。
Module Module1
Sub Main()
' 現在日時の表示
Dim NowDate = Date.Now
Console.WriteLine("現在日付 :" & NowDate.ToString("yyyy/MM/dd"))
' 日本カルチャとカレンダーの設定
Dim JPCulture As System.Globalization.CultureInfo = New System.Globalization.CultureInfo("ja-JP", True)
JPCulture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar()
' 元号なしの和暦を西暦に変換
Console.WriteLine()
Console.WriteLine("①元号なしの和暦を西暦に変換(レジストリErasに新年号(仮)を登録済)")
Dim SrcDate1 As String = "32/12/31"
Console.WriteLine("変換元(和暦):" & SrcDate1)
Dim DstDate1 As DateTime = DateTime.ParseExact(SrcDate1, "yy/MM/dd", JPCulture)
Console.WriteLine("変換後(西暦):" & DstDate1)
' 元号ありの和暦を西暦に変換
Console.WriteLine()
Console.WriteLine("②元号ありの和暦を西暦に変換(レジストリErasに新年号(仮)を登録済)")
Dim SrcDate2 As String = "平成32/12/31"
Console.WriteLine("変換元(和暦):" & SrcDate2)
Dim DstDate2 As DateTime = DateTime.ParseExact(SrcDate2, "gggyy/MM/dd", JPCulture)
Console.WriteLine("変換後(西暦):" & DstDate2)
Console.ReadKey()
End Sub
End Module
結果
元号なしの和暦「32/12/31」は「2050/12/31」となりました。まだ新元号が開始していないのに2050年ですか。
→ 個人的には想定外
元号ありの和暦「平成32/12/31」は「2020/12/31」となりました。
→ 想定通り
元号なしの和暦から西暦の変換は、最新のレジストリ値を基準として西暦に変換するようですね。
やはり基準となるべき元号がないといけないようです。
最後に
銀行から「入出金明細」の全銀フォーマットの和暦を変更しますよ。というお知らせを受けますが、
もうね、**この時代に元号なしの和暦ですか?**というツラみしかないですね。
310430 → 010501
このように、もともと元号のない和暦の"31"が2019年5月1日から"01"になりますというお知らせなので、
元号なしの和暦がどのように変換されるか確認してみたのです。
こんなときに余裕で受け身の取れるシステムなら良いのですが、そういうわけにはいかず…。
日付も考慮しながら、決め打ちで"30"か"31"なら平成、"01"から"29"なら新元号のような変換を組み込まないといけないようです。
マイクロソフト社が Windows 10 機能更新プログラム (2018 Spring Release) で??元号を設定していましたが、
これからどのようなタイミングで何が行われるのか気になります。