Почему форматирование DateTime как строки усекается и не округляется до миллисекунд?

Когда форматируется Double как округление строки. Например,

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

выводит

12346

Однако, когда 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));

выводит

2011-09-14T15:18:42.9990000
2011-09-14T15:18:42
2011-09-14T15:18:42.9

Какова причина (если таковая имеется) такого поведения?


Округление с точностью до секунды может быть достигнуто путем добавления полсекунды до форматирования в виде строки:

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));

выводит

2010-12-31T23:59:59
2011-01-01T00:00:00
13
задан Martin Liversage 15 September 2011 в 08:34
поделиться