Почему DateTime.Now.ToString ("u") не работает? - PullRequest
11 голосов
/ 27 мая 2009

Я сейчас нахожусь в Британское летнее время , что UTC + 1 час. Я подтвердил, что мой компьютер корректен с помощью следующего кода, и он возвращает true.

System.TimeZone.CurrentTimeZone.IsDaylightSavingTime(Date.Now)

Мой вопрос: почему форматер UTC не работает так, как я ожидал?

DateTime.Now.ToString("u")

Возвращает текущую системную дату, как показано ниже, в формате UTC, как ожидается, но с Z ( Zulu Time ) в конце, а не +01: 00?

т.е.

2009-05-27 14:21:22Z

не

2009-05-27 14:21:22+01:00

Это правильная функциональность?

Ответы [ 3 ]

21 голосов
/ 27 мая 2009

MSDN гласит следующее:

Представляет пользовательскую строку формата даты и времени, определенную свойством DateTimeFormatInfo.UniversalSortableDateTimePattern. Шаблон отражает определенный стандарт, а свойство доступно только для чтения. Следовательно, оно всегда одинаково, независимо от используемой культуры или поставщика формата. Строка пользовательского формата: «гггг» - «ММ» - «дд ЧЧ»: «мм»: «ss'Z» ».

Когда используется этот стандартный спецификатор формата, операция форматирования или синтаксического анализа всегда использует инвариантную культуру.

Форматирование не преобразует часовой пояс для объекта даты и времени. Поэтому приложение должно преобразовать дату и время в всемирное координированное время (UTC) перед использованием этого спецификатора формата.

Вам следует использовать следующий код для преобразования текущей даты в UTC перед ее форматированием:

DateTime.UtcNow.ToString("u")

или

DateTime.Now.ToUniversalTime().ToString("u")

Для отображения в формате, который вы ожидали (например, 2009-05-27 14: 21: 22 + 01: 00), вам нужно будет использовать пользовательский формат даты:

DateTime.Now.ToString("yyyy-MM-dd HH:mm:sszzz");
7 голосов
/ 27 мая 2009

«u» - универсальный сортируемый шаблон даты / времени, не в формате UTC; Цитировать документацию :

Представляет пользовательскую строку формата даты и времени, определенную свойством DateTimeFormatInfo .. ::. UniversalSortableDateTimePattern. Шаблон отражает определенный стандарт, а свойство доступно только для чтения. Следовательно, оно всегда одинаково, независимо от используемой культуры или поставщика формата. Строка пользовательского формата: «гггг» - «ММ» - «дд ЧЧ»: «мм»: «ss'Z» ».

Когда используется этот стандартный спецификатор формата, операция форматирования или синтаксического анализа всегда использует инвариантную культуру.

Форматирование не преобразует часовой пояс для объекта даты и времени. Поэтому приложение должно преобразовать дату и время в всемирное координированное время (UTC) перед использованием этого спецификатора формата.

3 голосов
/ 27 мая 2009

Вам необходимо использовать DateTime.Now.ToUniversalTime (). ToString ("u").

...