Double
が文字列として書式設定されている場合、丸めが使用されます。例えば。DateTimeを文字列としてフォーマットし、ミリ秒に丸めないのはなぜですか?
Console.WriteLine(12345.6.ToString("F0"));
出力
12346
しかし、文字列の切り捨てを使用するようDateTime
がフォーマットされている場合。例えば。
var ci = CultureInfo.InvariantCulture;
var dateTime = DateTime.Parse("2011-09-14T15:18:42.999", ci);
Console.WriteLine(dateTime.ToString("o", ci));
Console.WriteLine(dateTime.ToString("s", ci));
Console.WriteLine(dateTime.ToString("yyyy-MM-hhThh:mm:ss.f", ci));
出力
2011-09-14T15:18:42.9990000
2011-09-14T15:18:42
2011-09-14T15:18:42.9
この行動の背後にある理由(もしあれば)とは何ですか?最も近い秒に丸め
は、文字列として書式設定する前に半秒を添加することによって達成することができます。
var ci = CultureInfo.InvariantCulture;
var dateTime = DateTime.Parse("2010-12-31T23:59:59.999", ci);
Console.WriteLine(dateTime.ToString("s", ci));
var roundedDateTime = dateTime.AddMilliseconds(500);
Console.WriteLine(roundedDateTime.ToString("s", ci));
出力
2010-12-31T23:59:59
2011-01-01T00:00:00
+1、ありがとうございます。それは私が決して考えなかった次元です。 –
そして、新しい日が翌年になると、丸めは年まで一貫してカスケードします。ほとんどの状況では、おそらくあなたが望むものではないでしょう。 –
多分それについて考えてみる別の方法:時間の単位は時間ではなく_スピンです。時間単位は、次の(同じ)ユニットの開始まで完全に延びます。たとえば、火曜日までの道のりの0.99999は、「水曜日」ではなく「火曜日」と考えられます。 – Spike0xff