Conversion anciens et nouveaux à l'heure locale UTC sous Windows XP / Server 2003
-
12-09-2019 - |
Question
Mon application convertit les dates passées et présentes de l'heure locale à l'UTC.
Je dois assurer que je vais honorer toutes les futures mises à jour l'heure d'été à Windows lors de la manipulation encore correctement les dates passées.
L'application est écrit en C ++ et est en cours d'exécution sur le serveur 2003.
Options J'ai fait des recherches:
-
gmtime()
etlocaltime()
ne sont pas toujours correctes pour les dates antérieures parce qu'ils ne jamais respecter les règles de l'heure d'été en vigueur. ( SO question connexe) -
Une base de données tz est parce qu'il nécessite une mise à jour manuelle séparée.
-
GetTimeZoneInformationForYear()
est parce qu'il nécessite Vista / Server 2008. -
Past informations DST sont stockées dans le registre , mais je suis à la recherche de quelque chose de plus haut niveau.
-
-
us_dst_rules
est dépréciée et ne mettre à jour si les mises à jour OS. -
dst_calc_engine<>
son successeur, mais il ne respecte pas les mises à jour du système d'exploitation soit.
-
...
-
... Quelqu'un d'autre en utilisant la solution de registre brut pour le faire?
-
... d'autres suggestions?
(edit: dst_calc_engine
ne supporte pas l'heure d'été mises à jour )
La solution
Je pense que je préfère réimplémenter GetTimeZoneInformationForYear
et peut-être GetDynamicTimeZoneInformation
sur la base des informations contenues dans le registre HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
.
De cette façon, votre code Windows et suivez les mises à jour, vous pouvez échanger le code sale pour la mise en œuvre effective sur les plateformes haut niveau.
Puisque vous ne voulez pas que je pense utiliser une base de données externe, pas d'autres options sont viables.
Autres conseils
Vous pouvez utiliser gmtime () et localtime () pour les dates en 2007 et plus tard (et profiter des mises à jour de Windows DST), et l'utilisation Boost ou l'une des autres solutions que vous avez mentionné d'utiliser les bonnes règles DST 2006 et années antérieures.