【C#】TimeSpanの書式指定方法

System.TimeSpan 型の書式指定の方法です。

DateTime 型とは ToString の書式の指定が異なるので同じ感覚で記述すると以下の「System.FormatException」が発生します。

// こんな感じのエラーが出る
'span.ToString(@"dd\d\a\y mm\:ss\.fff")' は型 'System.FormatException' の例外をスローしました
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233033
    HelpLink: null
    InnerException: null
    Message: "Input string was not in a correct format."
    Source: "System.Private.CoreLib"
    StackTrace: "
        場所 System.Globalization.TimeSpanFormat.FormatCustomized(TimeSpan value, ReadOnlySpan`1 format, DateTimeFormatInfo dtfi, StringBuilder result)
        場所 System.Globalization.TimeSpanFormat.Format(TimeSpan value, String format, IFormatProvider formatProvider)
        場所 System.TimeSpan.ToString(String format)"
    TargetSite: {System.Text.StringBuilder FormatCustomized(System.TimeSpan, System.ReadOnlySpan`1[System.Char], System.Globalization.DateTimeFormatInfo, System.Text.StringBuilder)}

正しい記述方法は以下の通りです。

var span = new TimeSpan(1, 2, 3, 4, 5); // 1日 2時間 3分 4秒 5ms

// ★(1)
string str1 = span.ToString("dd\d\a\y\ mm\:ss\.fff");
// > 01day 03:04.005

// ★(2)
// 文字列補完で書式を指定する場合も同じ
string str2 = $@"{span:dd\d\a\y\ mm\:ss\.fff}";
// > 01day 03:04.005

書式指定中で書式指定文字以外を使用する場合、文字ごとに「\」を入れる必要があります。

  • 「day」と出力したい場合「\d\a\y」
  • 空白スペースも「\(空白)]
  • コロンやドットも「\:\.」

時間を表すHHだけhhに変える必要がありますが、あとはDateTimeの書式指定と指定方法は同じです。

上記を認識した状態でMSDNのリファレンスを読めば書式指定で例外が減ると思います。