概要
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
文字列 → 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 |
㍻ |