當使用字符串舍入格式化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,謝謝。這是我從未想過的一個維度。 –
如果新的一天是在下一年,那麼舍入級數一直到今年。在大多數情況下,可能不是你想要的日期。 –
也許另一種思考方式:時間單位是_spans_而不是時間點。單位時間完全延伸到下一個(同一)單位的開始。因此,例如通過週二的0.99999仍被視爲「星期二」 - 而不是「星期三」。 – Spike0xff