.NET
元号

2019年2月13日 Windows 10 Windows Updateに関する元号合字に関する不具合について


概要

2019年2月13日の更新で和暦関連のレジストリに合字が入ったことなどで、不具合が出たとの報道、Qiitaでのエントリが上がっている。

こちらに関して、文字列のパースに関する不具合 とは具体的にどのような不具合であるかが不明だったので、検証した。


追記

2019年2月19日 不具合修正版(オプションのため自動適用はされない。Microsoft Updateよりダウンロード)が公開された。Windows 10は、1803、1709が対象で、1809はまだ出ていない。この修正版を踏まえた検証結果は1809対応版がリリースされたら、別途記載する。

2月のパッチでWindowsの元号処理や仮想マシンの復元に問題 ~Microsoftが修正版を公開 | 窓の杜

https://forest.watch.impress.co.jp/docs/news/1170691.html


環境


  • Windows 10 Professional x64 1809 (OSビルド 17763.316)

  • Visual Studio 2017 Version 15.7.5

  • アプリケーションターゲットフレームワーク .NET Framework 4.5.2


2019年2月13日の更新


レジストリ

コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras

無題.png


文字列 → Datetime


Parseメソッド

Dim c As CultureInfo = New CultureInfo("ja-JP", True)

c.DateTimeFormat.Calendar = New JapaneseCalendar()

Dim s = (和暦文字列)
Dim d As Date = DateTime.Parse(s, c)
Debug.Print($"{d}")


2019年2月13日の合字レジストリで確認

和暦文字列
変換結果

平成12年12月12日
2000/12/12 0:00:00

平12年12月12日
System.FormatException: '文字列は有効な DateTime として認識されませんでした。インデックス 0 から始まる位置に不明な単語があります。'

㍻12年12月12日
2000/12/12 0:00:00

H12年12月12日
2000/12/12 0:00:00

平12/12/12
System.FormatException: '文字列は有効な DateTime として認識されませんでした。インデックス 0 から始まる位置に不明な単語があります。'

㍻12/12/12
2000/12/12 0:00:00

H12/12/12
2000/12/12 0:00:00


ParseExactメソッド

Dim c As CultureInfo = New CultureInfo("ja-JP", True)

c.DateTimeFormat.Calendar = New JapaneseCalendar()

Dim s = (和暦文字列)
Dim d As Date = DateTime.ParseExact(s, (形式指定子), c)
Debug.Print($"{d}")


2019年2月13日の合字レジストリで確認

和暦文字列
形式指定子
変換結果

平成12年12月12日
gyy年MM月dd日
2000/12/12 0:00:00

平12年12月12日
gyy年MM月dd日
System.FormatException: '文字列は有効な DateTime ではありませんでした。'

㍻12年12月12日
gyy年MM月dd日
2000/12/12 0:00:00


2019年2月13日のレジストリを以前の状態に変更して確認

和暦文字列
形式指定子
変換結果

平成12年12月12日
gyy年MM月dd日
2000/12/12 0:00:00

平12年12月12日
gyy年MM月dd日
2000/12/12 0:00:00

㍻12年12月12日
gyy年MM月dd日
System.FormatException: '文字列は有効な DateTime ではありませんでした。'


Datetime → 文字列


ToStringメソッド

Dim c As CultureInfo = New CultureInfo("ja-JP", True)

c.DateTimeFormat.Calendar = New JapaneseCalendar()

Dim d = New Date(2000, 12, 12)
Dim s = d.ToString(形式指定子), c)
Debug.Print($"{s}")


2019年2月13日の合字レジストリで確認

DateTime
形式指定子
変換結果

2000/12/12
gyy年MM月dd日
平成12年12月12日


GetAbbreviatedEraNameメソッド

Dim c As CultureInfo = New CultureInfo("ja-JP", True)

c.DateTimeFormat.Calendar = New JapaneseCalendar()

Dim era = c.DateTimeFormat.Calendar.GetEra(d)
Dim s = c.DateTimeFormat.GetAbbreviatedEraName(era)
Debug.Print($"{s}")


2019年2月13日の合字レジストリで確認

DateTime
変換結果

2000/12/12