string.formatを使用して、ミリ秒なしで完全な秒出力を出力します
-
30-09-2019 - |
質問
文字列内の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関数を使用して完全な秒のみを返す方法はありますか?
また、次のことで小数点以下の場所を削除しようとしました。
elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);
しかし、それはElapsedからも機能しません。MiliseCondsは500を整数として返します。
解決
変更
Console.WriteLine("> {0:hh:mm:ss}", elapsed);
に
Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed);
.NET 4を使用すると、TimesPanでカスタム形式の文字列を使用できます。 MSDNで利用可能なフォーマット仕様の完全な参照を見つけることができます カスタムタイムスパン形式の文字列 ページ。
「:」のキャラクターを「」で脱出する必要があります(逐語的な文字列を使用していない限り、それ自体は逃げる必要があります)。
MSDNからのこの抜粋 カスタムタイムスパン形式の文字列 ページは、「:」と「」を逃れることについて説明します。文字列の文字:
カスタムタイムスパン形式の仕様には、数時間、数分、数時間、または分数秒から数秒から日から離れたシンボルなど、プレースホルダーセパレーターのシンボルは含まれていません。代わりに、これらのシンボルは、文字列リテラルとしてカスタム形式の文字列に含める必要があります。たとえば、「dd.hh:mm」は、期間(。)を日と時間の間の分離器として定義し、コロン(:)時間と数分の間の分離器として定義します。
他のヒント
残念ながら、フォーマットすることはできません TimeSpan
と同じように DateTime
価値。ただし、TimesPanとDateTimeの両方がその価値をダニとして保存するため、クイックコンバージョンを行うことができます( Ticks
財産)。
あなたのコードでは、次のようになります:
Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));
アップデート: これは.NET 3.5以前に適用され、.NET 4はフォーマットタイムスパンをサポートしています。
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
うーん、これは厄介です(結局のところ) - 少なくとも.NET 4.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") + "."
これは、少なくともドキュメントから - .NET 4.0で修正されるように表示されます
あなたはこれを行うことができます:
dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString();
次のカスタム形式仕様y(年)、m(月)、d(day)、h(hour12)、h(hour 24)、m(minute)、s(2番目)、f(2番目の分数)、fがあります。 (2番目の割合、トレーリングゼロはトリミングされます)、t(pmまたはam)、z(タイムゾーン)。
次の例は、形式の指定器が出力にどのように書き換えられているかを示しています。 [C#
// create date time 2008-03-09 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);
String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}", dt); // "4 04 16 16" hour 12/24
String.Format("{0:m mm}", dt); // "5 05" minute
String.Format("{0:s ss}", dt); // "7 07" second
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes
String.Format("{0:t tt}", dt); // "P PM" A.M. or P.M.
String.Format("{0:z zz zzz}", dt); // "-6 -06 -06:00" time zone