2つの日付間の経過時間を文字列で表示したい。
次のコードがあるとしましょう。
DateTime date1 = DateTime.Now();
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now();
TimeSpan elapsed = date2.substract(date1);
Console.WriteLine("> {0:hh:mm:ss}", elapsed);
私が期待すること:
> 00:00:03
私が得るもの:
> 00:00:02.5002500
String.Format関数を使用して1秒だけを返す方法はありますか?
また、小数点以下の桁数を削除しようとしました:
elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);
しかし、それは経過してからも機能しません。Milisecondsは500を整数として返します。
変更
Console.WriteLine("> {0:hh:mm:ss}", elapsed);
に
Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed);
.Net 4では、Timespanでカスタム形式の文字列を使用できます。利用可能なフォーマット指定子の完全なリファレンスは、MSDN Custom TimeSpan Format Strings ページにあります。
「:」文字を「\」でエスケープする必要があります(逐語的な文字列を使用していない限り、それ自体をエスケープする必要があります)。
このMSDNからの抜粋 Custom TimeSpan Format Strings ページでは、「:」と「。」のエスケープについて説明しています。フォーマット文字列の文字:
カスタムTimeSpan形式指定子には、日を時から、時を分から、秒を小数秒から区切る記号など、プレースホルダー区切り記号は含まれていません。代わりに、これらの記号は文字列リテラルとしてカスタムフォーマット文字列に含める必要があります。たとえば、「dd.hh:mm」は、ピリオド(。)を日と時間の区切り文字として定義し、コロン(:)を時間と分の区切り記号として定義します。
残念ながら、TimeSpan
の値と同じ方法でDateTime
をフォーマットすることはできません。ただし、TimeSpanとDateTimeの両方が値をティックとして(Ticks
プロパティに)格納するため、迅速な変換を行うことができます。
あなたのコードでは次のようになります:
Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));
PDATE:これは.NET 3.5以前に適用され、.NET4はTimeSpansのフォーマットをサポートします。
TimeSpan
クラスにはHours
、Minutes
、およびSeconds
プロパティがあり、各時間部分を個別に返します。だからあなたは試すことができます:
String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}",
elapsed.Hours,
elapsed.Minutes,
elapsed.Seconds)
必要な形式を取得します。
もっと最適な方法があるかもしれませんが、私はまだそれを見つけていません。
これを行ういくつかの方法を検討した後、残念ながら私は醜い答えを残されています。ティックはフォーマットを正しく返さないため、実際には使用できませんが、以下は機能します。
DateTime date1 = DateTime.Now;
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now;
TimeSpan elapsed = date2.Subtract(date1);
string[] Split = elapsed.ToString().Split('.');
string m = Split[0]; // Returns 00:00:02
うーん、これは厄介です(結局のところ)-少なくとも.NET4.0より前は
ここに行くと: http://msdn.Microsoft.com/en-us/library/1ecy8h51(v = VS.90).aspx フォーマットのオーバーロードがないことがわかります。タイムスパンとあなたが手でそれをしなければならないこと例えば:
span.Hours.ToString("00") + ":" +
span.Minutes.ToString("00") + ":" +
span.Seconds.ToString("00") + "."
これは、少なくともドキュメントからは、.NET4.0で修正されているようです。