Quando un Double
viene formattato come un arrotondamento stringa viene utilizzato. Per esempio.Perché la formattazione di un DateTime come una stringa viene troncata e non attorno ai millisecondi?
Console.WriteLine(12345.6.ToString("F0"));
uscite
12346
Tuttavia, quando un DateTime
è formattato come viene utilizzato un troncamento stringa. Per esempio.
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));
uscite
2011-09-14T15:18:42.9990000
2011-09-14T15:18:42
2011-09-14T15:18:42.9
Qual è il ragionamento (se presente) alla base di questo comportamento?
arrotondamento al secondo più vicino può essere raggiunto aggiungendo mezzo secondo prima di formattare come una stringa:
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));
uscite
2010-12-31T23:59:59
2011-01-01T00:00:00
+1, grazie. Questa è una dimensione a cui non ho mai pensato. –
E se il nuovo giorno è nel prossimo anno, l'arrotondamento si riduce a cascata fino all'anno. Nella maggior parte delle situazioni probabilmente non è quello che vuoi per le date. –
Forse un altro modo per pensarci: le unità di tempo sono _spans_ non i punti di tempo. Un'unità di tempo si estende completamente fino all'inizio della successiva (stessa) unità. Quindi per esempio 0.99999 del modo in cui martedì è ancora considerato "martedì" - non "mercoledì". – Spike0xff