Parse Дата и время относительно часового пояса, указанного во входной строке - PullRequest
0 голосов
/ 20 мая 2019

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

var utcTime = DateTime.Parse("2019-05-20T13:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);
// utcTime = {5/20/2019 1:00:00 PM} (its kind is Utc and this is accepted)

var zonedTime1 = DateTime.Parse("2019-05-20T13:00:00-04:00", null, System.Globalization.DateTimeStyles.RoundtripKind);
//zonedTime1 = {5/20/2019 1:00:00 PM} (its kind is Local, but I was expecting {5/20/2019 9:00:00 AM} with Local kind)

var zonedTime2 = DateTime.Parse("2019-05-20T13:00:00+04:00", null, System.Globalization.DateTimeStyles.RoundtripKind);
//zonedTime2 = {5/20/2019 5:00:00 AM} (its kind is Local, but I was expecting {5/20/2019 5:00:00 PM} with Local kind)

Я хотел знать, где я ошибаюсь или где мои ожидания неверны. Если utcTime правильно проанализирован, то почему zonedTime1 и zonedTime2 приходят неправильно?

1 Ответ

1 голос
/ 20 мая 2019

Смещение в метке времени ISO 8601 описывает смещение от UTC, для которого уже было откорректировано в части местного времени. Таким образом:

  • 2019-05-20T13:00:00-04:00 = 2019-05-20T17:00:00Z = 2019-05-20T13:00:00-04:00
  • 2019-05-20T13:00:00+04:00 = 2019-05-20T09:00:00Z = 2019-05-20T05:00:00-04:00

Исходя из ваших ожидаемых результатов, я полагаю, что вы предполагали, что 13:00:00 будет значением UTC во всех трех случаях, но это не так.

Пара других вещей:

  • Проход null для культуры такой же, как проход CultureInfo.CurrentCulture. Вам лучше пропустить CultureInfo.InvariantCulture для отметок времени ISO 8601, так как это улучшит производительность и предотвратит ошибки, если в текущей культуре используется негригорианская система календарей.

  • При разборе на DateTime, если во входной строке присутствует любое смещение , результат будет скорректирован с учетом местного часового пояса. Исходное смещение будет учтено при преобразовании, но оно не будет сохранено. Таким образом, во многих случаях вам лучше использовать тип DateTimeOffset.

...