Подтвердить что ты не робот

Учитывает ли TimeZoneInfo DST?

Учитывается ли С# время перехода на летнее время при переходе между часовыми поясами?

У меня есть дата источника, которая находится в текущем времени в Лондоне, и я хочу преобразовать ее в свой часовой пояс (CET). Вот код, который я использую.

DateTime time = DateTime.ParseExact(timeString, "HH:mm", null);
time = DateTime.SpecifyKind(time, DateTimeKind.Unspecified);

//Convert it to the right timezone. It is currently in GMT

TimeZoneInfo gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
TimeZoneInfo current = TimeZoneInfo.Local;

DateTime utc = TimeZoneInfo.ConvertTimeToUtc(time, gmt);
DateTime local = TimeZoneInfo.ConvertTimeFromUtc(utc, core.startTime = local;

В настоящее время он работает хорошо. Однако, когда DST вернется к своей уродливой голове, продолжит ли она работать или это будет ужасно нарушено? Я немного опасаюсь TimeZones из-за того, что у меня было много проблем в прошлом.

4b9b3361

Ответ 1

TimeZoneInfo.GetAdjustmentRules предоставит вам набор правил об изменениях в смещении DST и при их входе и выходе из строя.

Тем не менее, ваш пользователь все еще может вскочить, сняв флажок "Автоматически настраивать переход на летнее время" в "Дата и время панели управления Windows". Если DST отключен в Windows, вы получите пустую коллекцию правил настройки.

Если вы хотите автоматическое применение правил настройки, вы должны использовать объекты DateTime, для которых установлен параметр DateTimeKind. Если DST выключен, это будет выполнено в процессе преобразования.

GMT - это солнечное время в Королевской обсерватории в Гринвиче. Англичане изобрели весь бизнес смещения часовых поясов с даты-линии, потому что они первыми координировали что-либо в глобальном масштабе. В безмятежные дни у них был планетарный флот парусников и радио. Отложенные заказы составляли недели или месяцы, поэтому последовательный, точный, глобальный тайм-аут был изобретен только людьми с системой отсчета больше планеты - Королевскими астрономами.

Приливные силы Луны замедляют вращение Земли. Требуется много сока, чтобы сломать океан воды вверх и вниз, и это не волшебство, оно происходит от момента вращения планеты.

Также длительность солнечной орбиты тоже не постоянна, поэтому мы время от времени прыгаем, чтобы синхронизировать календарь с планетарной реальностью. Сидерическое время, с другой стороны, не имеет такой глупости, поэтому мы отходим от него. Тогда есть релятивистский дрейф. Спутники GPS двигаются так быстро, что им фактически приходится компенсировать небольшое изменение времени.

Ответ 2

Учитывается ли С# время перехода на летнее время при переходе между часовыми поясами?

Да, если ваш компьютер будет обновляться, так как информация о часовом поясе иногда обновляется с обновлением Windows. Он должен по-прежнему работать даже без обновления Windows, если страна не изменила свои периоды времени DST (это произошло недавно в Австралии)

У меня есть дата источника, которая находится в текущем времени в Лондоне, и я хочу преобразовать ее в свой часовой пояс (CET)

Как вы относитесь к "исходной дате, которая является текущим временем в Лондоне"? Всегда сохраняйте свои даты в формате UTC и конвертируйте их "в последнюю минуту" в желаемое местное время.

Если вам интересно, что происходит, когда меняется переход на летнее время, вы можете проверить это, изменив часы на вашем компьютере.

Ответ 3

Будьте осторожны при работе с датами до 1987 года в .NET. Настройку корректировки по умолчанию в TimeZoneInfo для часового пояса, который вас интересует, может быть недостаточным для вашей цели. Подробнее здесь: http://blog.appliedis.com/2013/03/06/beware-daylight-saving-time-transitions-in-dot-net/

Ответ 4

По крайней мере, в .net 4.5 TimeZoneInfo обрабатывает летнее время.

Самый простой способ проверить это - сравнить BaseUtcOffset и GetUtcOffset

   var baseOffset = timeZoneInfo.BaseUtcOffset;
   var currentOffset = timeZoneInfo.GetUtcOffset(currentLocalTime);
   var isDst = currentOffset > baseOffset;
   var delta = currentOffset - baseOffset;

Это намного проще, чем иметь дело с AdjustmentRule, который вам не нужен, если вы заинтересованы только в настройке DateTime для DST.

Btw GMT устарел и заменен на UTC.