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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Claude BELLAMY
Le #22164651
"Jean-Marc Lienher" de groupe de discussion : 7128b$4bfb9a48$50532d57$
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)..



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/energie/developp/econo/textes/se_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_topissues#DST_and_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
Jean-Marc Lienher
Le #22165531
Jean-Claude BELLAMY wrote:

"Jean-Marc Lienher"
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.




...
Depuis W2k (sous NT4 c'est plus réduit) les paramètres d'heure sont
stockés ici :

HKLMSYSTEMCurrentControlSetControlTimeZoneInformation


...

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/cppchangetimezone.aspx

Je l'ai modifié et je suis arrivé à mes fins. Ca marche !!!

Merci encore.
Publicité
Poster une réponse
Anonyme