Преобразование старого и нового местного времени в UTC под управлением Windows XP / Server 2003
-
12-09-2019 - |
Вопрос
Мое приложение преобразует прошлые и настоящие даты из местного времени в UTC.
Мне нужно убедиться, что я буду соблюдать все будущие обновления DST для Windows, сохраняя при этом правильную обработку прошлых дат.
Приложение написано на C ++ и запущено на сервере 2003.
Варианты, которые я исследовал:
gmtime()
иlocaltime()
не всегда корректны для прошлых дат потому что они всегда будут соблюдать только текущие правила перехода на летнее время.(связанный С ЭТИМ вопрос SO)A база данных tz отсутствует, потому что для этого требуется отдельное обновление вручную.
GetTimeZoneInformationForYear()
отсутствует, потому что для этого требуется Vista / Server 2008.Информация о прошедших летних днях хранится в реестре, но я ищу что-то более высокого уровня.
Повышение
date_time
:- класс
us_dst_rules
устарел и не обновляется при обновлении операционной системы. - класс
dst_calc_engine<>
является его преемником, но также не учитывает обновления операционной системы.
- класс
Итак...
...кто-нибудь еще использует необработанное решение реестра для этого?
...есть еще какие-нибудь предложения?
(редактировать:выяснил dst_calc_engine
не поддерживает обновления в летнее время)
Решение
Я думаю, я бы предпочел повторно реализовать GetTimeZoneInformationForYear
и возможно GetDynamicTimeZoneInformation
на основе информации в реестре по адресу HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
.
Таким образом, ваш код будет следовать обновлениям Windows, и вы сможете заменить грязный код для фактической реализации на платформах более высокого уровня.
Поскольку вы не хотите использовать внешнюю базу данных, я думаю, что другие варианты невозможны.
Другие советы
Вы могли бы использовать gmtime() и localtime() для дат 2007 года и более поздних версий (и воспользоваться преимуществами обновлений Windows DST) и используйте Boost или одно из других упомянутых вами решений, чтобы использовать правильные правила перехода на летнее время для 2006 года и более ранних версий.