Подтвердить что ты не робот

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

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

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

выходы

12346

Однако, когда a 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
4b9b3361

Ответ 1

Это немного субъективно, но я бы сказал, что значения округления даты и времени, а не усечение их, приведут к "более неожиданному" поведению.

Например, округление new DateTime(2011, 1, 1, 23, 59, 59, 999) приведет к новому дню полностью. Это звучит гораздо более странно, чем просто урезание значения.

Ответ 2

Старый вопрос, но он был отнесен к новому, и ответы обсуждают причины округления или нет (что, конечно, действительно), но оставляет вопрос без ответа.

Причиной не округления является то, что ToString просто печатает детали даты/времени, которые вы запрашиваете.

Таким образом, например, он не будет округлен до ближайшей минуты:

Console.WriteLine(dateTime.ToString("yyyy-MM-hhThh:mm", ci));

Вывод:

2011-09-03T03:18

Без параметра ToString используется строка формата даты/времени по умолчанию для вашей среды.

Ответ 3

На последней единице измерения, если событие происходит на этой частоте, округление сокращается на сглаживание.

Например, если дрожание делает один второй фрейм данных в 2 мс во втором и следующем кадрах, чтобы достигнуть 990 мс в один и тот же фрейм, они оба будут отмечены как одна и та же секунда. Джиттер всего за несколько миллисекунд приведет к множеству разбросанных не уникальных значений ключа.

Округление положило бы их на несколько секунд чисто пока джиттер не станет намного более серьезным, скажем +/- 499 мс.

Цель округления - приостановить разрешение навсегда. Когда неопределенность находится ниже разрешения, он резко сокращает наложение.

"Каскадирование" может происходить только при разрешении границы. Например, число в год переключения кажется шокирующим, но это может произойти только при меньших чем вторая (или миллисекунда и т.д.) с полуночного нового года. Ничего неожиданного или особенно неточно.

Чтобы по-настоящему предотвратить сглаживание (то же самое время, упомянутое дважды), вам необходимо реализовать сглаживание (как это сделано в графике), после округления.