Преобразование даты и времени Добавление 5 часов - PullRequest
3 голосов
/ 03 марта 2020

Я вставляю записи в таблицу данных в c#, где преобразование даты и времени дает им дополнительные 5 часов.

DateTime.ParseExact("2020-02-19T15:28:36.207Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture);

Это дает мне 20:28 вместо 15:28. Вот ответ от c#

{2/19/2020 8:28:36 PM}
    Date: {2/19/2020 12:00:00 AM}
    Day: 19
    DayOfWeek: Wednesday
    DayOfYear: 50
    Hour: 20
    Kind: Local
    Millisecond: 207
    Minute: 28
    Month: 2
    Second: 36
    Ticks: 637177409162070000
    TimeOfDay: {20:28:36.2070000}
    Year: 2020```

Ответы [ 3 ]

6 голосов
/ 03 марта 2020

Конвертируется в местное время. Если вы укажете DateTimeStyles.AdjustToUniversal в качестве последнего аргумента, вы получите значение Kind, равное Universal, и время 3:28 вечера :

var result = DateTime.ParseExact(
    "2020-02-19T15:28:36.207Z",
    "yyyy-MM-ddTHH:mm:ss.fffZ",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AdjustToUniversal);

Обратите внимание, что значение перечисления имя здесь несколько неудачное, так как вы на самом деле не настраиваете - вы говорите, что вы не хотите настроить местное время. Из документов :

Если входная строка обозначает время UT C, через спецификатор часового пояса или AssumeUniversal преобразования не происходит.

2 голосов
/ 03 марта 2020

DateTime отформатирован в ISO 8601 в UT C (с суффиксом «Z»). Синтаксический анализ в режиме Roundtrip (DateTime.Parse("...", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind)) автоматически обработает его правильно:

Строки, которые передаются в методы Parse, TryParse, ParseExact и TryParseExact DateTime и DateTimeOffset может быть проанализирован с помощью спецификатора формата «O» или «o», если они находятся в одном из этих форматов. В случае объектов DateTime перегрузка синтаксического анализа, которую вы вызываете, должна также включать параметр styles со значением DateTimeStyles.RoundtripKind. Обратите внимание, что если вы вызовете метод синтаксического анализа со строкой пользовательского формата, которая соответствует спецификатору формата "O" или "o", вы не получите те же результаты, что и "O" или "o". Это связано с тем, что методы синтаксического анализа, использующие строку нестандартного формата, не могут анализировать строковое представление значений даты и времени, в которых отсутствует компонент часового пояса, или использовать «Z» для обозначения UT C. [мой акцент]

Что не так в коде: указав «Z» в качестве символа в строке формата, вы буквально сопоставляете символ «Z» (заглавная «Z» не является спецификатором пользовательского формата), что приводит к выбрасыванию информации о часовом поясе и в зависимости от параметра DateTimeStyles для интерпретации часового пояса. Можно выбрать правильное значение для этого, но лучшим вариантом является использование режима формата туда-обратно, который уже знает, как позаботиться об этом.

Редактировать: досадно, DateTime.ParseExact( datestr, "o", CultureInfo.InvariantCulture ) (синтаксический анализ с " o ") не работает, но анализ с параметром DateTimeStyles.RoundtripKind работает. Спасибо @SirRufo за указание на это.

1 голос
/ 03 марта 2020

Вы можете изменить строку формата даты и времени на yyyy-MM-ddTHH:mm:ss.fff'Z' и получить время без смещения часового пояса, поскольку спецификатор формата Z предназначен для смещения между текущим часовым поясом и UT C:

спецификатор пользовательского формата "z" представляет смещение часового пояса локальной операционной системы со всемирным координированным временем (UT C) со знаком, измеренное в часах.

Поместив его в кавычки, вы получите правильный результат

var result = DateTime.ParseExact("2020-02-19T15:28:36.207Z", "yyyy-MM-ddTHH:mm:ss.fff'Z'", CultureInfo.InvariantCulture); //returns 2/19/2020 3:28:36 PM

Дополнительные 5 часов означают, что часовой пояс вашей ОС - UTC + 5

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