Conversion de l'heure d'un fuseau horaire en temps universel
Voici un algorithme de conversion de temps CET (central european time) en temps universel (GMT) qui tient compte des heures d'été / hiver.
L'horaire d'été est entré en vigueur en France en 1976. C'est pourquoi pour les dates antérieure le temps en France est à GMT + 1 toute l'année.
On passe de l'heure d'hiver (GMT+1) à l'heure d'été (GMT+2) le dernier dimanche de mars à 2 heures. La transformation inverse a lieu le dernier dimanche d'octobre à 3 heures.
Références:
- L'article de Wikipedia.
- Faut-il en finir avec l'heure d'été (rapport du Sénat).
L'horaire d'été est entré en vigueur en France en 1976. C'est pourquoi pour les dates antérieure le temps en France est à GMT + 1 toute l'année.
On passe de l'heure d'hiver (GMT+1) à l'heure d'été (GMT+2) le dernier dimanche de mars à 2 heures. La transformation inverse a lieu le dernier dimanche d'octobre à 3 heures.
Références:
- L'article de Wikipedia.
- Faut-il en finir avec l'heure d'été (rapport du Sénat).
Voici l'algorithme :
On suppose que l'on dispose d'une fonction retjousem() qui retourne le jour de la semaine de 0 pour dimanche à 6 pour samedi.
Avant mars on est en heure d'hiver. Après octobre en heure d'hiver.
D'avril à septembre on est à l'heure d'été.
Détaillons le cas du mois de mars, le mois d'octobre se traite de manière identique.
Avant le 25 on est à l'heure d'hiver, on n'a à traiter que du 25 au 31.
Si on est un dimanche et qu'il est moins de 2H, on est à l'heure d'hiver.
Si on est un dimanche et qu'il est plus de 2H, on est à l'heure d'été.
Calculons delta = 31 - jour dans le mois
Alors si retjousem() + delta >= 7 on est en heure d'hiver, sinon on est en heure d'été.
Voici deux démonstrations :
1. Intuitive : on est est heure d'hiver si en allant à la fin du mois à partir d'aujourd'hui, on rencontre dimanche. C'est le cas si retjousem() + delta >= 7. On peut même dire que si retjousem() + delta = 7, alors le dimanche est le dernier jour du mois.
2. Systématique
Il suffit de regarder toutes les configurations possibles et montrer que la formule marche (49 cas à tester).
Table des jours de la semaine :
jour du mois | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
delta | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | |
6 | 0 | 1 | 2 | 3 | 4 | 5 | |
5 | 6 | 0 | 1 | 2 | 3 | 4 | |
4 | 5 | 6 | 0 | 1 | 2 | 3 | |
3 | 4 | 5 | 6 | 0 | 1 | 2 | |
2 | 3 | 4 | 5 | 6 | 0 | 1 | |
1 | 2 | 3 | 4 | 5 | 6 | 0 |
Exemple de code C++ déterminant le décalage par rapport à GMT du fuseau CET :
short STIME::calcule_CET_delta()
{
if( annee < 1976 ) return 1;
if( mois < 3 ) return 1;
if( mois > 10 ) return 1;
if( mois > 3 & mois < 10 ) return 2;
// mois 3 ou 10
short avant, apres;
if( mois == 3 ) { avant = 1; apres = 2; }
else { avant = 2; apres = 1; }
if( jour < 25 ) return avant;
short jousem = retjousem();
if( jousem == 0 ) return heure > 1 ? apres : avant; // ambiguité ici entre 2H et 3 H en octobre
return (31 - jour + jousem) >= 7 ? avant : apres;
}
Commentaires
Afficher les commentaires en Vue non groupée | Vue groupée
JULLIEN sur :
Votre algorithme est basé sur le temps CET, serait-il possible d'étendre cette étude au temps universel TU et au temps solaire vrai TSV pour n'importe quel fuseau horaire ? En demandant à l'utilisateur seulement sa latitude, longitude, quantieme de jour, et heure locale auxquels il souhaite avoir TU et TSV.
Merci d'avance.