Skip to content

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).

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 mois25262728293031
delta
6543210

0123456

6012345

5601234

4560123

3456012

2345601

1234560


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;
}


Rétroliens

Pas de rétroliens

Commentaires

Afficher les commentaires en Vue non groupée | Vue groupée

JULLIEN sur :

Bonjour,

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.

Ajouter un commentaire

Marquer un texte en gras: *mot*, souligner un texte: _mot_.
Les smilies standard comme :-) et ;-) sont convertis en images.
:'(  :-)  :-|  :-O  :-(  8-)  :-D  :-P  ;-) 
Les adresses Email ne sont pas affichées, et sont seulement utilisées pour la communication.
Form options