C# TimeSpan の Format 指定して文字列に変換する

DateTime型は ToString() メソッドで文字列に変換する際に、"yyyy/MM/dd HH:mm:ss" などのフォーマット(カスタム DateTime 書式指定文字列)を指定して文字列に変換できることは広く知られています。

これに関しての詳細は MSDN の カスタムの日付と時刻の書式指定文字列を参照下さい。

しかし、同じ感覚で TimeSpan型を ToString() メソッドで文字列に変換と「FormatException 入力文字列の形式が正しくありません。」という例外が発生してしまいます。

    DateTime dt = new DateTime(2000, 1, 1);
         
    // 書式を指定して出力
    Console.WriteLine(dt.ToString("yyyy/MM/dd HH:mm:ss"));
    
    // 結果:2000/01/01 00:00:00
    
    TimeSpan ts = new TimeSpan(23, 59, 59);
     
    // 書式を指定して出力(まちがった例) 
    Console.WriteLine(ts.ToString("HH:mm:ss"));
    
    // 例外:FormatException 入力文字列の形式が正しくありません。

MSDN の解説が分かりにくく、TimeSpan型を ToString() メソッドで文字列に変換する際にフォーマット(カスタム書式指定文字列)を指定できないと誤解している方も多いのですが、実際は Format の形式が異なるだけで、書式の指定は可能です。ただし、.NET Framework 4 以降に限ります。

TimeSpan.ToString メソッド (String)

ポイントは2点で

  • TimeSpan型の場合は時間指定が"HH"ではなく小文字の"hh"
  • 書式指定子以外の文字はすべて'\'でエスケープする必要がある

これを踏まえて書き直すと、下のようになります。

    // 書式を指定して出力
    Console.WriteLine(ts.ToString(@"hh\:mm\:ss"));
    
    // 結果:23:59:59

.NET Framework 4 以前のバージョンの場合は、0を指定して生成したDateTime型 を利用して出力する方法が一般的のようです。

    // DateTimeを利用して出力
    Console.WriteLine(new DateTime (0).Add(ts).ToString("HH:mm:ss"));
    
    // 結果:23:59:59
使用環境: Visual Studio 2010 .NET Framework 4

C# メニューリスト