Introduction
L'Heure d'Été (DST) est l'un des aspects les plus complexes de la gestion des dates et heures. Ce tutoriel vous enseignera comment gérer correctement les transitions DST dans votre code.
Ce que Vous Apprendrez
- ✅ Qu'est-ce que le DST et quand il se produit
- ✅ Le problème "Spring Forward" (heure manquante)
- ✅ Le problème "Fall Back" (heure dupliquée)
- ✅ Meilleures pratiques pour gérer le DST
- ✅ Exemples pratiques en JavaScript et Python
Qu'est-ce que le DST ?
L'Heure d'Été est la pratique d'avancer les horloges pendant les mois plus chauds :
- Spring Forward (Printemps) : Les horloges avancent d'1 heure (ex. 2h00 → 3h00)
- Fall Back (Automne) : Les horloges reculent d'1 heure (ex. 3h00 → 2h00)
Dates de Transition (2024)
| Région | Spring Forward | Fall Back |
|---|---|---|
| France | 31 mars | 27 octobre |
| USA | 10 mars | 3 novembre |
| Australie | 6 octobre | 7 avril |
Le Problème de l'Heure Manquante
Quand les horloges "sautent en avant", une heure entière n'existe pas.
JavaScript
JAVASCRIPT1// En fuseau horaire français (Europe/Paris) 2// Le 31 mars 2024, 2h00 n'existe pas 3 4const dateProbleme = new Date('2024-03-31T02:30:00'); 5// JavaScript ajuste automatiquement à 3h30 6 7// Utiliser Luxon pour meilleur contrôle 8import { DateTime } from 'luxon'; 9 10const dt = DateTime.fromObject( 11 { year: 2024, month: 3, day: 31, hour: 2, minute: 30 }, 12 { zone: 'Europe/Paris' } 13); 14console.log(dt.isValid); // true, mais ajusté 15console.log(dt.hour); // 3 (ajusté)
Python
PYTHON1from datetime import datetime 2from zoneinfo import ZoneInfo 3 4paris = ZoneInfo('Europe/Paris') 5 6# Ceci s'ajuste automatiquement 7dt = datetime(2024, 3, 31, 2, 30, tzinfo=paris) 8print(dt) # S'ajuste à heure valide
Le Problème de l'Heure Dupliquée
Quand les horloges "reculent", la même heure se produit deux fois.
JavaScript avec Luxon
JAVASCRIPT1import { DateTime } from 'luxon'; 2 3// 27 octobre 2024, 2h30 se produit DEUX fois à Paris 4const premiereFois = DateTime.fromObject( 5 { year: 2024, month: 10, day: 27, hour: 2, minute: 30 }, 6 { zone: 'Europe/Paris' } 7).set({ offset: 120 }); // +02:00 (avant le changement) 8 9const deuxiemeFois = DateTime.fromObject( 10 { year: 2024, month: 10, day: 27, hour: 2, minute: 30 }, 11 { zone: 'Europe/Paris' } 12).set({ offset: 60 }); // +01:00 (après le changement) 13 14console.log(premiereFois.toISO()); // 2024-10-27T02:30:00+02:00 15console.log(deuxiemeFois.toISO()); // 2024-10-27T02:30:00+01:00
Python
PYTHON1from datetime import datetime 2from zoneinfo import ZoneInfo 3 4paris = ZoneInfo('Europe/Paris') 5 6# fold=0 signifie première occurrence (avant le changement) 7# fold=1 signifie deuxième occurrence (après le changement) 8premiere = datetime(2024, 10, 27, 2, 30, fold=0, tzinfo=paris) 9deuxieme = datetime(2024, 10, 27, 2, 30, fold=1, tzinfo=paris) 10 11print(f"Première : {premiere} (décalage : {premiere.strftime('%z')})") 12print(f"Deuxième : {deuxieme} (décalage : {deuxieme.strftime('%z')})")
Meilleures Pratiques
1. Toujours Travailler en UTC
JAVASCRIPT1// ✅ Stocker en UTC 2const timestampUtc = Date.now(); 3const dateUtc = new Date(timestampUtc).toISOString(); 4// "2024-03-31T01:30:00.000Z" - toujours valide 5 6// Convertir en local seulement pour afficher 7const local = new Date(timestampUtc).toLocaleString('fr-FR', { 8 timeZone: 'Europe/Paris' 9});
2. Utiliser des Bibliothèques de Fuseau Horaire
PYTHON1# ✅ Utiliser zoneinfo ou pytz 2from zoneinfo import ZoneInfo 3 4# ❌ Ne pas faire de calculs manuels d'offset 5offset = -5 # Ignore le DST !
3. Valider les Dates Pendant les Transitions
JAVASCRIPT1function estDateValide(year, month, day, hour, minute, zone) { 2 const dt = DateTime.fromObject( 3 { year, month, day, hour, minute }, 4 { zone: zone } 5 ); 6 7 if (!dt.isValid) { 8 return { valide: false, raison: 'Heure n\'existe pas (gap DST)' }; 9 } 10 11 // Vérifier si l'heure a été ajustée 12 if (dt.hour !== hour || dt.minute !== minute) { 13 return { 14 valide: true, 15 ajustee: true, 16 heureOriginale: `${hour}:${minute}`, 17 heureAjustee: `${dt.hour}:${dt.minute}` 18 }; 19 } 20 21 return { valide: true, ajustee: false }; 22}
Erreurs Courantes à Éviter
1. Supposer que tous les jours ont 24 heures
PYTHON1# ❌ Incorrect 2jour_suivant = date + timedelta(hours=24) 3 4# ✅ Correct - utiliser des jours 5jour_suivant = date + timedelta(days=1)
2. Coder les offsets manuellement
JAVASCRIPT1// ❌ Incorrect 2const offset = -5 * 60 * 60 * 1000; // EST toujours 3 4// ✅ Correct - utiliser bibliothèque 5const zone = 'America/New_York'; // Gère DST automatiquement
Résumé
- Spring Forward : Une heure n'existe pas - valider et ajuster
- Fall Back : Une heure se produit deux fois - spécifier laquelle
- Règle d'or : Stocker en UTC, afficher en local
- Utiliser des bibliothèques : Ne pas calculer les offsets manuellement
Essayez notre Convertisseur de Fuseau Horaire pour voir comment fonctionnent les conversions pendant les transitions DST !