为什么将DateTime格式化为字符串截断而不是以毫秒为单位?

Mar*_*age 13 .net c# datetime truncate rounding

当a Double格式化为字符串时使用舍入.例如

Console.WriteLine(12345.6.ToString("F0"));
Run Code Online (Sandbox Code Playgroud)

输出

12346
Run Code Online (Sandbox Code Playgroud)

但是,当a 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));
Run Code Online (Sandbox Code Playgroud)

输出

2011-09-14T15:18:42.9990000
2011-09-14T15:18:42
2011-09-14T15:18:42.9
Run Code Online (Sandbox Code Playgroud)

这种行为背后的原因是什么(如果有的话)?


在格式化为字符串之前,可以通过添加半秒来实现舍入到最接近的秒:

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));
Run Code Online (Sandbox Code Playgroud)

输出

2010-12-31T23:59:59
2011-01-01T00:00:00
Run Code Online (Sandbox Code Playgroud)

Joã*_*elo 17

这有点主观,但我会说舍入日期和时间值而不是截断它们会导致"更多"意外行为.

例如,舍入new DateTime(2011, 1, 1, 23, 59, 59, 999)将完全导致新的一天.这听起来比仅截断值更奇怪.

  • +1,谢谢.这是我从未想过的一个维度. (2认同)