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)将完全导致新的一天.这听起来比仅截断值更奇怪.