メモの日々


2020年12月03日(木) [長年日記]

[c#] C#で日時の書式設定

C#での日時(DateTimeOffset)の文字列化についてちょっとメモ。DateTimeについても同じだと思うがここではDateTimeOffsetだけを対象としている。

ToString()

日時はToString()メソッドを使用すると文字列化することができる。このメソッドは、リファレンスによれば

ToString("G", CultureInfo.CurrentCulture)

と同じ挙動をする。Gは標準の日時書式指定文字列である。ただ、Gはカルチャによりフォーマットが大きく変わるので困ることがある。

> var d = DateTimeOffset.Now;
> d.ToString()
"2020/12/02 18:06:31 +09:00"
> d.ToString(CultureInfo.CreateSpecificCulture("en-us"))
"12/2/2020 6:06:31 PM +09:00"
> d.ToString(CultureInfo.InvariantCulture)
"12/02/2020 18:06:31 +09:00"
> d.ToString(DateTimeFormatInfo.InvariantInfo)
"12/02/2020 18:06:31 +09:00"

書式指定文字列sとu

標準の日付書式指定文字列はカルチャの影響を受けるものが多く使いにくい。使えそうなのはsuくらいだと思った。ただし、タイムゾーンがどう扱われるのかには注意する必要がある。

> d.ToString("s")
"2020-12-02T18:06:31"
> d.ToString("u")
"2020-12-02 09:06:31Z"

カスタム日時形式文字列

カルチャの影響を受けないように柔軟に日時の文字列化をするにはカスタム日時形式文字列を使う。次のような感じ。

> d.ToString("yyyy-MM-dd HH:mm:ss.fffK")
"2020-12-02 18:33:10.948+09:00"