为什么格式化日期时间为一个字符串截断而不是圆的毫秒?时间为、字符串、而不是、日期

2023-09-04 00:52:39 作者:迎风泪

双击被格式化为一个字符串舍入被使用。例如,

  Console.WriteLine(12345.6.ToString(F0));
 

输出

  12346
 
我电脑里有双系统 一个放在了D盘 可我吧D盘格式化了 为什么开机的时候还是要选择一个系统 一个明明已经不能使用了

然而,当的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.