Changer de zone horaire en C -> europe et sydney
Le
Jean-Marc Lienher
Hello,
J'essaie de changer la zone horaire à l'aide de la variable
d'environnement "TZ", mais je n'arrive pas à avoir les bons changements
été-hiver pour l'Europe.
J'utilise Windows XP sp3 et visual C++ .Net 2002.
J'ai trouvé ces valeurs sur grâce à google "TZ=MET-1METDST" ou
"TZ=MEZ-1MESZ". Je les ai testées (_putenv,_tzset,_localtime64), cela
fonctionne à peu près.
Mais le changement hiver-été se fait le premier dimanche d'avril au lieu
du dernier dimanche de mars.
Quelle doit être la valeur de TZ pour avoir les changements hiver-été
actuels de l'Europe (Paris) ?
Et si en plus vous pouviez me donner la valeur pour l'Australie (Sydney)..
Un grand merci d'avance.
J'essaie de changer la zone horaire à l'aide de la variable
d'environnement "TZ", mais je n'arrive pas à avoir les bons changements
été-hiver pour l'Europe.
J'utilise Windows XP sp3 et visual C++ .Net 2002.
J'ai trouvé ces valeurs sur grâce à google "TZ=MET-1METDST" ou
"TZ=MEZ-1MESZ". Je les ai testées (_putenv,_tzset,_localtime64), cela
fonctionne à peu près.
Mais le changement hiver-été se fait le premier dimanche d'avril au lieu
du dernier dimanche de mars.
Quelle doit être la valeur de TZ pour avoir les changements hiver-été
actuels de l'Europe (Paris) ?
Et si en plus vous pouviez me donner la valeur pour l'Australie (Sydney)..
Un grand merci d'avance.

Poser une question


Depuis W2k (sous NT4 c'est plus réduit) les paramètres d'heure sont stockés
ici :
HKLMSYSTEMCurrentControlSetControlTimeZoneInformation
L'activation du système d'heure d'été est stocké dans l'entrée
"DisableAutoDaylightTimeSet"
de type REG_WORD
valeur :
0x1 -> observation d'heure d'été non appliquée
0x0 (ou absente) -> observation d'heure d'été appliquée
En ce qui concerne la définition des mois de changement d'heure, c'est
stocké dans les entrées :
"StandardStart"
et
"DaylightStart".
Elles sont de type REG_BINARY, et contiennent 16 octets, qui représentent
une structure "SYSTEMTIME" :
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
Le n° de mois de changement d'heure est stocké dans le 3ème octet
(= octet de poids faible du champ wMonth)
- heure d'hiver :
"StandardStart"
-> 3ème octet = 0x0A (= actuellement octobre en Europe)
- heure d'été :
"DaylightStart"
-> 3ème octet = 0x03 (= actuellement mars)
Les valeurs de ces paramètres (0x03, 0x0A) sont stockées dans la clef
HKLMSOFTWAREMicrosoftWindows NTCurrentVersionTime Zonesxxxxxxx
Avec, pour l'Europe occidentale, xxxxx = "Romance Standard Time"
L'entrée contenant les valeurs numériques s'appelle
"TZI"
et est de type REG_BINARY (à partir de l'offset 0x0C)
Pour l'Australie, il y a plusieurs clefs vu l'étendue du pays :
"W. Australia Standard Time"
(UTC+08:00) Perth
"Cen. Australia Standard Time"
(UTC+09:30) Adélaïde
NB: dans d'autres versions de Windows, on trouve :
"AUS Central Standard Time"
"Darwin" à la place d'Adélaïde
"E. Australia Standard Time"
(UTC+10:00) Brisbane
NB: dans d'autres versions, on trouve :
"AUS Eastern Standard Time"
"Canberra, Melbourne, Sydney" à la place de Brisbane
J'ai remarqué qu'en ce qui concerne l'Australie Ouest et Centre (mais pas
Est), il y a une sous-clef supplémentaire "Dynamic DST", qui contient un
nombre variable d'entrées : "FirstEntry", "Lastentry" (REG_DWORD) dont les
valeurs respectives pointent vers d'autres entrées qui sont des n° d'années
(2005, 2006, ...2010) (REG_BINARY)
En ce qui concerne l'heure de passage à l'heure d'été ou d'hiver, suivant la
version de Windows, je ne trouve pas la correspondance dans
"TimeZoneInformation".
En effet,
(http://www.industrie.gouv.fr/energi...e_heur.htm)
"depuis 1998 pour l'ensemble des pays de l'Union
Européenne, le passage à l'heure d'été intervient
le dernier dimanche de mars à 2 heures du matin
et le passage à l'heure d'hiver intervient le dernier
dimanche d'octobre à 3 heures du matin."
On retrouve bien :
la valeur 0x02 dans DaylightStart
la valeur 0x03 dans StandardStart
mais PAS AU BON ENDROIT !
D'après la structure SYSTEMTIME, ce devrait être au 9ème octet, or c'est au
7ème dans la BDR
Un mystère microsoftien !!! ;+)
Pour info, il y a eu des patchs concernat les changements de DST en 2008 :
http://support.microsoft.com/gp/dst...TZ_changes
(je n'ai pas lu en détail)
Et j'ai vu qu'il était question d'un correctif pour l'Australie Ouest :
http://support.microsoft.com/kb/914387/en-us (en anglais)
http://support.microsoft.com/kb/914387/ (en français)
--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
...
...
Merci pour toutes ces informations détaillées.
J'ai refait une recherche sur google en avec ces infos et j'ai
trouvé cette page qui propose un programme C++ qui change de timezone en
utilisant la base de registre :
http://www.codeproject.com/KB/cpp/c...ezone.aspx
Je l'ai modifié et je suis arrivé à mes fins. Ca marche !!!
Merci encore.