Это ожидаемое поведение 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
объектов специально для решения этой проблемы.