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

# 概要

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

- [マイクロソフトさん、お願いですから.NET Frameworkの動作を何の説明もなく変更するのはやめてください。- 改元対応で思うこと | Qiita](https://qiita.com/gushwell/items/88411bb2c833e7d7ff6b)

- [Microsoft、「KB4487044」適用で元号に不具合 | PC Watch](https://pc.watch.impress.co.jp/docs/news/1170425.html)

- [2019 年 2 月 13 日 — KB4487044 (OS ビルド 17763.316) | Microsoft](https://support.microsoft.com/ja-jp/help/4487044/windows-10-update-kb4487044)

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

## 追記

**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](https://qiita-image-store.s3.amazonaws.com/0/204150/9451be9f-fc6b-df4e-397a-487e4eff4ca6.png)


### 文字列　→　Datetime

#### Parseメソッド

```vb
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メソッド

```vb
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メソッド

```vb
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メソッド

```vb
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|㍻|