Как получить смещение при преобразовании времени в определенный часовой пояс, а затем в UTC?C # - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь преобразовать дату в формат UTC, где я могу получить правильное смещение.Я использую ToString("O") в простом DateTime.Now, который работает.

Теперь, когда я конвертирую текущее время (EST) в CST (центральное) или MST (гора), тогда я не получаю смещение.Что мне здесь не хватает?Есть ли другой способ сделать это?

Код:

var currentTimeToUtc = DateTime.Now.ToString("O");
// Output = "2018-12-27T12:31:21.9946661-05:00" --This is perfect.

var centralTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, "Central Standard Time");
var centralTimeToUtc = centralTime.ToString("O");
// Output = "2018-12-27T11:31:19.8046052"
// Expected Output = "2018-12-27T11:31:19.8046052-06:00"

var mountainTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, "Mountain Standard Time");
var mountainTimeToUtc = mountainTime.ToString("O");
// Output = "2018-12-27T10:31:25.2438418"
// Expected Output = "2018-12-27T10:31:25.2438418-07:00"

1 Ответ

0 голосов
/ 27 декабря 2018

Это ожидаемое поведение DateTime.Если вам необходимо сохранить информацию о часовом поясе, используйте DateTimeOffset.

Причина различий в выходных данных заключается в том, что DateTime.Now и centralTime / mountainTime имеют различный тип : DateTime до преобразования Local, но после преобразования оно становится Unspecified.

Запустите программу ниже, чтобы подтвердить это:

var now = DateTime.Now;
Console.WriteLine(now.Kind);
var centralTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, "Central Standard Time");
Console.WriteLine(centralTime.Kind);
var mountainTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now, "Mountain Standard Time");
Console.WriteLine(mountainTime.Kind);

Поведение не может быть измененопотому что DateTime не сохраняет смещение;для интерпретации часового пояса он использует два общеизвестных смещения - Local означает ваш местный часовой пояс, а UTC означает часовой пояс UTC.

Третий параметр, Unspecified, означает, чтозначение DateTime не может быть интерпретировано как абсолютное значение само по себе, поскольку часовой пояс был удален из него.Ваш код знает, какой это часовой пояс, потому что вы выполнили преобразование, но информация о часовом поясе является частью дизайна вашей программы, а не частью соответствующего объекта DateTime..NET добавил DateTimeOffset объектов специально для решения этой проблемы.

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