Почему спецификатор формата "U" изменяет значение DateTime? - PullRequest
0 голосов
/ 25 мая 2020

Я столкнулся со странным поведением при использовании описателя формата «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, чтобы определить общий формат результирующей строки.

Почему бы спецификатор формата изменить значение? Далее, зачем менять на час?

Ответы [ 2 ]

2 голосов
/ 25 мая 2020

Как вы можете прочитать здесь Описатель формата Universal Sortable ("u")

преобразование исходного значения DateTime не выполняется

А здесь Универсальный описатель полного («U») формата

значение автоматически конвертируется в UT C

Так для теста 2 и 3 утверждают против tim.ToUniversalTime().

0 голосов
/ 26 мая 2020

Описатель формата «U» может использоваться только для DateTime DateTimeKind.Ut c. Поэтому, изменив конструктор DateTime, я могу произвести проходящие тесты с ожидаемыми результатами:

DateTime tim = new DateTime(2020, 03, 29, 00, 59, 59, DateTimeKind.Utc);

//test 1
Assert.Equal("2020-03-29 00:59:59Z", tim.ToString("u", CultureInfo.GetCultureInfo("en-GB")));
//test 2
Assert.Equal("29 March 2020 00:59:59", tim.ToString("U", CultureInfo.GetCultureInfo("en-GB")));
//test 3
Assert.Equal("Sunday, March 29, 2020 12:59:59 AM", tim.ToString("U", CultureInfo.GetCultureInfo("en-US")));
//test 4
Assert.Equal("2020-03-29 00:59:59Z", tim.ToString("u", CultureInfo.GetCultureInfo("en-US")));

Я сообщу об этом в Microsoft как об ошибке, потому что разумный ответ на использование «U» (или « u ") спецификатор формата с DateTime, отличным от UT C, должен вызывать исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...