TimeSpan ToString形式


95

気になるのは、「5h 3m 30s」のような出力に使用できるフォーマット文字列はありますか?

例えば。(明らかに間違っています)

myTimeSpan.ToString("hh mm ss")

回答:


143

試してください:

myTimeSpan.ToString("h'h 'm'm 's's'")

(スペースであっても引用符で囲む必要があることに注意してください。それが私の最初の試みの問題でした。)

もちろん、.NET 4を使用していると思います。それ以前は、TimeSpanカスタム形式の文字列をサポートしていませんでした。

編集:前述のとおり、これは24時間を超えると機能しません。野田タイムからも利用できる選択肢があることにも注意してください:)


5
これは24時間以上の時間を正しくフォーマットしないため、Dimensionの回答を参照してください。
スコット

「dd'd 'hh'h' mm'm '」-これは私にとってはうまくいきます。フォーマットしたテキストをアポストロフィで囲む必要があることを考慮してください: "dd'days used '"。ここでddは、データの平和と「自分のテキストを「費やした日数」」です
Pavel Shkleinik

37

Jon Skeetからの回答を使用するときは、次のようなコードでこれに注意してください。

// 12 days, 23 hours, 24 minutes, 2 seconds.
TimeSpan span = new TimeSpan(12, 23, 24, 2);
// 27 hours, 24 minutes, 2 seconds
TimeSpan span2 = new TimeSpan(27,24,2);

string format = span.ToString("h'h 'm'm 's's'");
string format2 = span2.ToString("h'h 'm'm 's's'");
Console.WriteLine(format);
Console.WriteLine(format2);
Console.ReadLine();

次のような結果が得られます。

23h 24m 2s
3h 24m 2s

時間形式は、最大で23時間を表示できます。27時間を表示したり、12日を時間に変換したりすることはなく、単に存在しないかのように切り捨てます。

これを修正する1つの方法は、TimeSpanの長さをチェックし、タイムスパンが1年、1日などに基づいているかどうかに基づいてフォーマットを作成する拡張機能を作成することです。または、日が途切れることがないため、常に日を表示することもできます。

string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");

私はプログラミングの初心者です。これは、すべての時間を表示するだろうと想定した後、私が幸運にもこれに気付くことができた後にのみ、観測からのものです。私がこれを言っているのは、無限の時間を表示できる別の時間形式など、より良い解決策があるかどうかがわからないためです。

しかし、私はこのフォーマットが本来の機能を果たしていると思います。あなたはそれを知っている必要があります。したがって、この投稿。Jon Skeetの回答は、この形式が、最大23時間の日付タイプ形式の時間プロパティのみを表示することであることを決して示していません。


14
それTotalHoursがTimeSpanにetcがある理由です。おそらく、このたかったMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili

17

残念ながら.NET4を使用していない場合:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);

9
24時間以上をサポートする必要があるコードの場合、このソリューションTotalHoursは、新しいバージョンの.netでも実行できる方法です。
CodesInChaos 2013

1
あなたはそれを信頼できるので、私は実際にこれがより良いと思います。
Chris Marisic

使用している場合は注意してくださいTotalHoursことがあるとして、doubleではないintようHoursで、それは時間の分画だけでなく、全体の時間が表示されます、すなわち。
Jinlye 2017

6

連結についてはどうですか:

String oTime = myTimeSpan.ToString("h") + "h " +
               myTimeSpan.ToString("m") + "m " +
               myTimeSpan.ToString("s") + "s "

更新1:

一重引用符でエスケープできます。 h'h 'm'm 's's'


11
あなたは連結を使用するつもりなら、あなたにも使用することがありますHoursMinutesSecondsIMOの特性。個人的には、引用を理解した後、カスタムのフォーマット文字列を使用したいと思います。
Jon Skeet


5

ここで他のすべての答えを試した後、私が機能した唯一の形式を使用Xamarin.NET Portable 4.5ました:

timespan.ToString("hh':'mm':'ss");

本質的に私は:それらをエスケープするために一重引用符で囲んでいます。


2

正規表現に少し似たフォーマット文字列を見つけることがあります。後でコードに戻ったときに、ニュアンスを忘れてしまいました。したがって、私は次のことを行ったので、ドキュメントを返送する可能性は低くなります。

string FormatTimeSpan(TimeSpan timeSpan) =>
    $"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";

C#6で導入された文字列補間により、これが他の場合よりも明確になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.