【令和】新元号対応に関するMicrosoft Win32等の時限措置に関する検証について

# 時限措置

経済産業省公開文書で、4月限定の時限措置に関する記載があります。

改元に伴う元号による年表示の取扱いについて（平成３１年４月１日新元号への円滑な移行に向けた関係省庁連絡会議申合せ）
https://www.meti.go.jp/policy/it_policy/kaigen/20190402_kaigen_2.pdf

> （３）元号法第１項に基づく政令の公布後の取扱い 元号法（昭和 54 年法律第 43 号）第１項に基づく政令の公布日か ら施行日前までの間において、各府省が作成し公にする文書に元号 を用いて改元日以降の年を表示する場合は、「平成」を用いるもの とする

こちらについて、Microsoftの3/18のセミナーでは不確定情報として対応を検討するような話が出ていました。
https://qiita.com/tfukumori/items/1dc60eb473eff5efb994/revisions/110

# 検証

Win32のAPIを参照するDelphiの環境で、この時限措置が適用されたのかは不明ですが、システム日時が5月にならないと新元号が表示されないという問題がでた、という記事がありました。

[【令和】Microsoft の元号対応が迷走している件 | Qiita](https://qiita.com/ht_deko/items/249db60e1c99ba440969)

Win32、VBA、VB6、Microsoft.VisualBasic.Compatibility.VB6.Formatにもかかわる問題と思われるので、oleaut32.dllを直接呼び出して検証してみることにしました。

**(4/14追記)** 上記記事コメントにて @ht_deko さんに教えていただきましたが、影響を受けたAPIは、datetimeapi.h ヘッダー のGetDateFormatA 関数などのようです。詳細は[上記記事コメント](https://qiita.com/ht_deko/items/249db60e1c99ba440969#comment-46f30442c5f62807b0f8)をご参照ください。

## 環境

Windows 10 1809 (OSビルド 17763.437)
https://support.microsoft.com/ja-jp/help/4493509/windows-10-update-kb4493509

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/c70ad81a-9bb8-f01d-a5f0-f759bfa1e7a8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/167aec30-0742-137c-67c5-6025590120b4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/4acb96aa-3d0d-b77f-3c4b-28e0a31bed9b.png)



## レジストリ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/fef850a1-dee8-39dc-3acf-b2b435f8cc50.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/0d14258f-e134-b681-dded-c05cc97fa36a.png)

## コード

```csharp:Class1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Class1
    {
        private static class NativeMethods
        {
            [DllImport("oleaut32.dll", CharSet = CharSet.Unicode)]
            internal static extern int VarFormat(ref object expr,
                    string format,
                    int firstDay,
                    int firstWeek,
                    int flags,
                    [MarshalAs(UnmanagedType.BStr)] out string result);

        }

        public static string Vb6Format(object expr, string format)
        {
            string result;
            int hr = NativeMethods.VarFormat(ref expr, format, 0, 0, 0, out result);
            if (hr != 0) throw new COMException("Format error", hr);
            return result;
        }
    }
}
```

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var d = DateTime.Parse("2019/5/1");
            Console.WriteLine( Class1.Vb6Format(d, "gggee年mm月dd日"));
            Console.ReadLine();
        }
    }
}
```

## 結果

結果としては、直接oleaut32.dllを呼び出した場合には、システム日付が4月でも、時限措置が適用されず、新元号が表示される形となりました。

```
令和01年05月01日
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/e96fafa4-d852-f44b-a002-03c4a48d09b4.png)