Tutoriels

Gérer les Changements d'Heure d'Été (DST) : Guide Complet pour Développeurs

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égionSpring ForwardFall Back
France31 mars27 octobre
USA10 mars3 novembre
Australie6 octobre7 avril

Le Problème de l'Heure Manquante

Quand les horloges "sautent en avant", une heure entière n'existe pas.

JavaScript

// En fuseau horaire français (Europe/Paris)
// Le 31 mars 2024, 2h00 n'existe pas

const dateProbleme = new Date('2024-03-31T02:30:00');
// JavaScript ajuste automatiquement à 3h30

// Utiliser Luxon pour meilleur contrôle
import { DateTime } from 'luxon';

const dt = DateTime.fromObject(
  { year: 2024, month: 3, day: 31, hour: 2, minute: 30 },
  { zone: 'Europe/Paris' }
);
console.log(dt.isValid); // true, mais ajusté
console.log(dt.hour);    // 3 (ajusté)

Python

from datetime import datetime
from zoneinfo import ZoneInfo

paris = ZoneInfo('Europe/Paris')

# Ceci s'ajuste automatiquement
dt = datetime(2024, 3, 31, 2, 30, tzinfo=paris)
print(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

import { DateTime } from 'luxon';

// 27 octobre 2024, 2h30 se produit DEUX fois à Paris
const premiereFois = DateTime.fromObject(
  { year: 2024, month: 10, day: 27, hour: 2, minute: 30 },
  { zone: 'Europe/Paris' }
).set({ offset: 120 }); // +02:00 (avant le changement)

const deuxiemeFois = DateTime.fromObject(
  { year: 2024, month: 10, day: 27, hour: 2, minute: 30 },
  { zone: 'Europe/Paris' }
).set({ offset: 60 }); // +01:00 (après le changement)

console.log(premiereFois.toISO()); // 2024-10-27T02:30:00+02:00
console.log(deuxiemeFois.toISO()); // 2024-10-27T02:30:00+01:00

Python

from datetime import datetime
from zoneinfo import ZoneInfo

paris = ZoneInfo('Europe/Paris')

# fold=0 signifie première occurrence (avant le changement)
# fold=1 signifie deuxième occurrence (après le changement)
premiere = datetime(2024, 10, 27, 2, 30, fold=0, tzinfo=paris)
deuxieme = datetime(2024, 10, 27, 2, 30, fold=1, tzinfo=paris)

print(f"Première : {premiere} (décalage : {premiere.strftime('%z')})")
print(f"Deuxième : {deuxieme} (décalage : {deuxieme.strftime('%z')})")

Meilleures Pratiques

1. Toujours Travailler en UTC

// ✅ Stocker en UTC
const timestampUtc = Date.now();
const dateUtc = new Date(timestampUtc).toISOString();
// "2024-03-31T01:30:00.000Z" - toujours valide

// Convertir en local seulement pour afficher
const local = new Date(timestampUtc).toLocaleString('fr-FR', {
  timeZone: 'Europe/Paris'
});

2. Utiliser des Bibliothèques de Fuseau Horaire

# ✅ Utiliser zoneinfo ou pytz
from zoneinfo import ZoneInfo

# ❌ Ne pas faire de calculs manuels d'offset
offset = -5  # Ignore le DST !

3. Valider les Dates Pendant les Transitions

function estDateValide(year, month, day, hour, minute, zone) {
  const dt = DateTime.fromObject(
    { year, month, day, hour, minute },
    { zone: zone }
  );

  if (!dt.isValid) {
    return { valide: false, raison: 'Heure n\'existe pas (gap DST)' };
  }

  // Vérifier si l'heure a été ajustée
  if (dt.hour !== hour || dt.minute !== minute) {
    return { 
      valide: true, 
      ajustee: true,
      heureOriginale: `${hour}:${minute}`,
      heureAjustee: `${dt.hour}:${dt.minute}`
    };
  }

  return { valide: true, ajustee: false };
}

Erreurs Courantes à Éviter

1. Supposer que tous les jours ont 24 heures

# ❌ Incorrect
jour_suivant = date + timedelta(hours=24)

# ✅ Correct - utiliser des jours
jour_suivant = date + timedelta(days=1)

2. Coder les offsets manuellement

// ❌ Incorrect
const offset = -5 * 60 * 60 * 1000; // EST toujours

// ✅ Correct - utiliser bibliothèque
const 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 !

Essayez

Testez votre conversion de timestamp

Résultat de date

Besoin de plus d'options ? Convertisseur de fuseau horaire