要約
C#のDateTimeでUTC現在時刻を取得して、ToStringしたものを表示しようとしたところ、罠にはまりかけたので、備忘録です。
Windowsの設定と年月日表示形式
Windowsの設定の時刻と言語から、年月日の表示を変えることができます。
また、「カレンダー」の項目で西暦/和暦を選択することができます。
ここを変更すると、タスクバーの端の年月日の表示形式が変わります。
DateTimeのToStringはWindows設定の西暦/和暦に引っ張られる
CultureInfoが"ja-JP"となっている場合(設定を変えていない限りは基本的に何も指定しないlocalも"ja-JP"だと思います)、このWindowsの西暦/和暦にDateTime.ToStringの表示が引っ張られます。
西暦を選択した場合
Console.WriteLine($"{DateTime.UtcNow.ToString("yyyy", new CultureInfo("ja-JP"))}");
// 出力:2023
和暦を選択した場合
Console.WriteLine($"{DateTime.UtcNow.ToString("yyyy", new CultureInfo("ja-JP"))}");
// 出力:05 (令和5年を指す)
設定によらずToStringで西暦を取得したい場合
CultureInfoに西暦をデフォルトで使用するようなものを指定すればよいです。("en-US"やCultureInfo.InvaritCutltureなど。)
これらを指定しておけば、Windowsの設定にかかわらず西暦で年が表示されます。
Console.WriteLine($"{DateTime.UtcNow.ToString("yyyy", new CultureInfo("en-US"))}");
// 出力:2023
Console.WriteLine($"{DateTime.UtcNow.ToString("yyyy", CultureInfo.InvariantCulture)}");
// 出力:2023
おまけ
プログラム起動中に西暦/和暦の設定を変更してもToStringの表示は変わりませんでした。
プログラム起動時の設定が適用されるようです。
試したコード👇