Я столкнулся со странным поведением при использовании описателя формата «U» для DateTime, как показано в следующих проходящих тестах:
DateTime tim = new DateTime(2020, 03, 29, 00, 59, 59);
//test 1
Assert.Equal("2020-03-29 00:59:59Z", tim.ToString("u", CultureInfo.GetCultureInfo("en-GB")));
//test 2
Assert.Equal("28 March 2020 23:59:59", tim.ToString("U", CultureInfo.GetCultureInfo("en-GB")));
//test 3
Assert.Equal("Saturday, March 28, 2020 11:59:59 PM", tim.ToString("U", CultureInfo.GetCultureInfo("en-US")));
//test 4
Assert.Equal("2020-03-29 00:59:59Z", timA.ToString("u", CultureInfo.GetCultureInfo("en-US")));
Test1 и Test4 выдают ожидаемую строку, содержащую дату и время для отображения пользователю; 2020-03-29 00:59:59. Однако Test2 и 3 отображает строку, показывающую время на час раньше; 28 марта 2020 23:59:59. Почему спецификатор формата изменяет значение?
Документация Microsoft определяет:
- «u» (универсальная сортировка даты / времени; строка стандартного формата) UniversalSortableDateTimePattern , чтобы определить строку результата, соответствующую стандарту ISO 8601 для всемирного координированного времени. Свойство доступно только для чтения.
- «U» (универсальная полная дата / время; строка стандартного формата) FullDateTimePattern, чтобы определить общий формат результирующей строки.
Почему бы спецификатор формата изменить значение? Далее, зачем менять на час?