VB.NET TimeSpan の Format 指定して文字列に変換する

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

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

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

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

 の解説が分かりにくく、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