銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

DateTimeとTimeSpanの書式文字列が違うという話

知ってればそれだけなのですが、System.DateTimeSystem.TimeSpanでは指定できる書式文字列が異なります。知らずによくわからないエラーを出して一瞬困りました。

たとえば、DateTimeオブジェクトで時間のところで HH:mm:ss という形式で出力したい場合は次のようにカスタム書式文字列を指定できます。

DateTime.Now.ToString("HH:mm:ss")

が、TimeSpanオブジェクトは同じように指定するとエラーになります。

DateTime.Now.TimeOfDay.ToString("HH:mm:ss")

標準のTimeSpan書式文字列のcを指定するか、カスタム書式文字列の場合は時間は小文字のhを使ったうえで:\でエスケープする必要があります*1

DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss")
DateTime.Now.TimeOfDay.ToString("c")

なんでこんな使い方をする必要があったかというと、MySQLでDate型のカラムをDateTime型にマッピングして、Time型のカラムをTimeSpan型にマッピングしていたためでした。ドキュメントはこちらにあるのでカルチャーによる違いなど詳細はこちらを参考にしてください。

docs.microsoft.com

docs.microsoft.com

*1:なお標準書式文字列cは1日以上の場合の日付部分と小数点以下の秒も出力されるという違いがあります