LoginSignup
2
1

【C#/.NET/Windows】DateTimeのToStringで西暦/和暦(Windows設定)の罠にはまりかけた話

Last updated at Posted at 2023-09-18

要約

C#のDateTimeでUTC現在時刻を取得して、ToStringしたものを表示しようとしたところ、罠にはまりかけたので、備忘録です。

Windowsの設定と年月日表示形式

Windowsの設定の時刻と言語から、年月日の表示を変えることができます。

image.png

また、「カレンダー」の項目で西暦/和暦を選択することができます。

image.png

ここを変更すると、タスクバーの端の年月日の表示形式が変わります。

  • 西暦
    image.png

  • 和暦
    image.png

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の表示は変わりませんでした。
プログラム起動時の設定が適用されるようです。

試したコード👇

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1