Cuando se formatea un Double
se utiliza el redondeo de cadena. P.ej.¿Por qué el formatear un DateTime como una cadena trunca y no redondea los milisegundos?
Console.WriteLine(12345.6.ToString("F0"));
salidas
12346
Sin embargo, cuando un DateTime
se formatea como se utiliza un truncamiento de cadena. P.ej.
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));
salidas
2011-09-14T15:18:42.9990000
2011-09-14T15:18:42
2011-09-14T15:18:42.9
Cuál es el razonamiento (si lo hay) detrás de este comportamiento?
El redondeo hasta el último segundo se puede lograr mediante la adición de medio segundo antes de formatear como una cadena:
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));
salidas
2010-12-31T23:59:59
2011-01-01T00:00:00
+1, gracias. Esa es una dimensión en la que nunca pensé. –
Y si el nuevo día es el próximo año, las cascadas de redondeo todo el año. En la mayoría de las situaciones, probablemente no sea lo que quieres para las fechas. –
Quizás otra forma de pensarlo: las unidades de tiempo son _paneles_ no puntos temporales. Una unidad de tiempo se extiende completamente hasta el inicio de la siguiente (misma) unidad. Entonces, por ejemplo, 0.99999 del camino hasta el martes todavía se considera "Martes", no "Miércoles". – Spike0xff