在双击
被格式化为一个字符串舍入被使用。例如,
Console.WriteLine(12345.6.ToString(F0));
输出
12346
然而,当的DateTime
被格式化为一个字符串截断使用。例如,
变种CI = CultureInfo.InvariantCulture;
VAR日期时间= 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
什么是推理(如果有的话)这种行为背后?
四舍五入到最接近的第二个可以通过添加半秒钟格式化为一个字符串之前来实现:
变种CI = CultureInfo.InvariantCulture;
VAR日期时间= 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
解决方案
这是一个有点主观的,但我要说的是四舍五入的日期和时间值,而不是截断它们会导致一个更意外行为。
例如,四舍五入新的日期时间(2011年,1,1,23,59,59,999)
将导致新的一天完全。这听起来不是仅仅截断值更奇怪的。
When a Double
is formatted as a string rounding is used. E.g.
Console.WriteLine(12345.6.ToString("F0"));
outputs
12346
However, when a DateTime
is formatted as a string truncation is used. E.g.
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));
outputs
2011-09-14T15:18:42.9990000
2011-09-14T15:18:42
2011-09-14T15:18:42.9
What is the reasoning (if any) behind this behavior?
Rounding to nearest second can be achieved by adding half a second before formatting as a string:
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));
outputs
2010-12-31T23:59:59
2011-01-01T00:00:00
解决方案
This is a bit subjective, but I would say that rounding date and times values as opposed to truncating them would result in a "more" unexpected behavior.
For example, rounding new DateTime(2011, 1, 1, 23, 59, 59, 999)
would result in a new day completely. This sounds much more weird than just truncating the value.