Является ли мой код точно интерпретирующим эту строку даты и времени?

58
5

Я получаю следующую строку из api:

{ "CallTime" : "2018-02-23T16:00:01.806Z" }

В моей базе данных я хочу сохранить все дату/время в zulu time. Для этого я использую DateTime.Parse чтобы преобразовать эту строку в объект DateTime. Затем я использую ToUniversalTime() чтобы изменить время на время zulu (а затем я храню это в базе данных).

Однако я не уверен, правильно ли я понимаю интерпретацию часовых поясов. Если я посмотрю на результаты, это меня смущает:

DateTime.Parse("2018-02-23T16:00:01.806Z") /* = 2/23/2018 10:00:01 AM */
DateTime.Parse("2018-02-23T16:00:01.806Z").ToUniversalTime() /* = 2/23/2018 4:00:01 PM */

Не является ли исходная строка уже в зулу? Я бы подумал, что эти два значения должны быть одинаковыми. В исходной строке нет указания часового пояса, так что функция Parse не будет автоматически принимать zulu-время? Или же Parse использует часовой пояс локальной системы и использует это для преобразования строки в объект?

спросил(а) 2020-04-04T00:35:28+03:00 6 месяцев, 3 недели назад
1
Решение
58

Правильный ответ: да, да.

Поскольку многие комментарии указывают на то, что DateTime.Parse() использует DateTimeKind.Local default-> 2/23/2018 10:00:01 AM Когда вы вызываете ToUniversalTime(), вы получаете UTC-время again-> 4 вечера

ответил(а) 2020-04-04T00:51:22.148028+03:00 6 месяцев, 3 недели назад
41

Вместо того, чтобы вызывать ToUniversalTime, подумайте об изменении кода для передачи DateTimeStyles.RoundTripKind. Это специально предназначено для оценки строки и соответствующего вида. Другими словами, когда он видит Z, он устанавливает тип DateTimeKind.Utc и дает вам значение, основанное на UTC. Если он видит смещение, он будет корректировать смещение, преобразовать в локальное время и установить DateTimeKind.Local. Если он не видит ни то, он устанавливает DateTimeKind.Unspecified.

DateTime.Parse("2018-02-23T16:00:01.806Z", CultureInfo.InvariantCulture,
DateTimeStyles.RoundTripKind);

Кроме того, вы можете обнаружить, что использование DateTimeOffset более интуитивно и практично, чем DateTime. Вам также не нужно беспокоиться о настройке стиля, если вы это сделаете.

ответил(а) 2020-04-04T00:35:28+03:00 6 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема