09 janv. 2025·8 min de lecture

Bugs liés au changement d’heure : règles pour les timestamps et les rapports

Règles pratiques pour éviter les bugs liés au changement d’heure : stocker des timestamps propres en UTC, afficher l’heure locale correctement et produire des rapports vérifiables.

Bugs liés au changement d’heure : règles pour les timestamps et les rapports

Pourquoi ces bugs arrivent dans des produits ordinaires

Les problèmes de temps apparaissent dans des produits courants parce que les gens ne vivent pas en UTC. Ils vivent en heure locale, et l’heure locale peut avancer d’un coup, reculer, ou voir ses règles changer au fil des années. Deux utilisateurs peuvent regarder le même instant et voir des horloges différentes. Pire : la même heure affichée localement peut correspondre à deux instants réels différents.

Les bugs liés au changement d’heure (DST) se manifestent souvent seulement deux fois par an, donc ils passent sous le radar. Tout parait correct en développement, puis un vrai client réserve un rendez‑vous, saisit une feuille de temps, ou consulte un rapport pendant le week‑end du changement et quelque chose cloche.

Les équipes remarquent en général quelques motifs : une « heure manquante » où des éléments planifiés disparaissent ou sont décalés, une heure dupliquée où les logs ou alertes semblent doublés, et des totaux quotidiens qui dérivent parce qu’un « jour » a duré 23 ou 25 heures.

Ce n’est pas seulement un problème de développeur. Le support reçoit des tickets du type « votre appli a changé l’heure de ma réunion ». Les finances voient des revenus journaliers décalés. Les opérations se demandent pourquoi des jobs nocturnes ont tourné deux fois ou ont été sautés. Même des filtres « créés aujourd’hui » peuvent diverger entre utilisateurs de régions différentes.

L’objectif est ennuyeux mais fiable : stocker le temps d’une manière qui ne perd jamais son sens, afficher l’heure locale comme les humains s’y attendent, et produire des rapports qui restent justes même les jours étranges. Quand vous y arrivez, chaque partie de l’entreprise peut faire confiance aux chiffres.

Que vous développiez avec du code maison ou une plateforme comme AppMaster, les règles sont les mêmes. Vous voulez des timestamps qui préservent le moment original, plus assez de contexte (comme le fuseau horaire de l’utilisateur) pour expliquer à quoi ressemblait ce moment sur son horloge.

Un modèle simple et compréhensible du temps

La plupart des bugs DST viennent du mélange entre « un instant dans le temps » et « la façon dont une horloge l’affiche ». Séparez ces idées et les règles deviennent beaucoup plus simples.

Quelques termes, en clair :

  • Timestamp : un instant précis sur la timeline (indépendant du lieu).
  • UTC : une horloge de référence globale utilisée pour représenter les timestamps de façon cohérente.
  • Heure locale : ce que voit une personne sur une horloge murale à un endroit donné (comme 9h00 à New York).
  • Offset : la différence par rapport à l’UTC à un moment donné, écrite comme +02:00 ou -05:00.
  • Fuseau horaire : un nom qui regroupe les règles décidant de l’offset pour chaque date, comme America/New_York.

Un offset n’est pas la même chose qu’un fuseau horaire. -05:00 indique seulement la différence par rapport à l’UTC à un instant précis. Il ne dit pas si le lieu passe à -04:00 en été, ou si la loi changera l’année suivante. Un nom de fuseau contient ces règles et l’historique.

Le DST change l’offset, pas le timestamp sous‑jacent. L’événement a eu lieu au même instant ; seule l’étiquette de l’horloge locale change.

Deux situations causent la plupart des confusions :

  • Saut de printemps : l’horloge avance, donc une plage d’heures locales n’existe pas (par exemple, 2h30 peut être impossible).
  • Répétition d’automne : l’horloge recule, donc la même heure locale se produit deux fois (par exemple, 1h30 peut être ambiguë).

Si un ticket de support est créé à « 1h30 » pendant la répétition d’automne, vous avez besoin du fuseau horaire et du instant exact (timestamp UTC) pour trier correctement les événements.

Règles de données qui évitent la plupart des problèmes

La plupart des bugs DST commencent comme un problème de données, pas de formatage. Si la valeur stockée est ambiguë, chaque écran et rapport doit deviner, et ces suppositions divergeront.

Règle 1 : Stocker les événements réels comme un instant absolu (UTC)

Si quelque chose s’est produit à un instant précis (paiement capturé, ticket répondu, shift commencé), stockez le timestamp en UTC. UTC ne saute pas en avant ni en arrière, il reste stable lors des changements DST.

Exemple : un agent support à New York répond à 9h15 heure locale le jour du changement d’heure. Stocker le moment en UTC garde cette réponse dans le bon ordre quand quelqu’un à Londres relira le fil plus tard.

Règle 2 : Conserver le contexte de fuseau comme un ID de fuseau IANA

Quand il faut afficher l’heure de façon humaine, il faut connaître le fuseau de l’utilisateur ou du lieu. Stockez‑le comme un ID de fuseau IANA tel que America/New_York ou Europe/London, pas comme un libellé vague du type “EST”. Les abréviations peuvent signifier des choses différentes et les offsets seuls ne couvrent pas les règles DST.

Un schéma simple : heure de l’événement en UTC, plus un champ de fuseau séparé attaché à l’utilisateur, au bureau, au magasin ou à l’appareil.

Règle 3 : Stocker les valeurs uniquement‑date comme des dates, pas des timestamps

Certaines valeurs ne sont pas des instants. Les anniversaires, « renouvelle le 5 » et les dates d’échéance de facture devraient souvent être stockées comme des champs date seulement. Si vous les stockez comme timestamp, les conversions de fuseau peuvent les faire passer au jour précédent ou suivant.

Règle 4 : Ne jamais stocker l’heure locale comme une chaîne sans contexte de zone

Évitez d’enregistrer des valeurs comme “2026-03-08 02:30” ou “9:00 AM” sans fuseau. Cette heure peut être ambiguë (se produire deux fois) ou impossible (sautée) lors des transitions DST.

Si vous devez accepter une saisie locale, stockez à la fois la valeur locale et l’ID de zone, puis convertissez en UTC à la frontière (API ou soumission de formulaire).

Décider quoi stocker selon le type d’enregistrement

Beaucoup de bugs DST viennent du fait qu’un type d’enregistrement est traité comme un autre. Un journal d’audit, une réunion de calendrier et une clôture de paie ressemblent tous à « une date et heure », mais ils ont besoin de données différentes pour rester fiables.

Pour les événements passés (ce qui s’est déjà produit) : stockez un instant exact, généralement un timestamp UTC. Si vous devez expliquer comment l’utilisateur l’a vu, conservez aussi le fuseau de l’utilisateur au moment de l’événement (un ID IANA comme America/New_York, pas juste “EST”). Cela vous permet de reconstruire l’affichage même si l’utilisateur change plus tard son fuseau dans son profil.

Pour la planification (ce qui doit se produire à une heure murale locale) : stockez la date et l’heure locales prévues plus l’ID de zone. Ne convertissez pas en UTC en jetant la valeur locale originale. « 10 mars à 09:00 en Europe/Berlin » est l’intention. L’UTC est une valeur dérivée qui peut changer si les règles évoluent.

Les changements sont normaux : les gens voyagent, les bureaux déménagent, les entreprises changent de politique. Pour les enregistrements historiques, ne réécrivez pas les temps passés quand un utilisateur met à jour son fuseau. Pour les plannings futurs, décidez si l’événement suit l’utilisateur (pratique pour les voyageurs) ou reste attaché à un lieu fixe (pratique pour un bureau), et stockez le fuseau correspondant.

Les données héritées ne contenant que des timestamps locaux sont délicates. Si vous connaissez le fuseau source, attachez‑le et traitez l’ancienne valeur comme locale. Sinon, marquez‑la comme « flottante » et soyez honnête dans les rapports (par exemple, afficher la valeur stockée sans conversion). Il est utile de modéliser ces cas avec des champs séparés pour éviter que les écrans et rapports ne les mélangent involontairement.

Étape par étape : stocker les timestamps en toute sécurité

Flux de travail multi-fuseaux
Construisez des outils internes (ticketing, feuilles de temps) qui fonctionnent entre bureaux et régions.
Démarrer un projet

Pour arrêter les bugs DST, adoptez un système d’enregistrement non ambigu pour le temps, puis ne convertissez qu’au moment d’afficher aux humains.

Formulez la règle pour votre équipe : tous les timestamps en base sont en UTC. Mettez‑la dans la docs et dans les commentaires de code autour de la gestion des dates. C’est le genre de décision qui peut être annulée par inadvertance plus tard.

Un schéma de stockage pratique :

  • Choisissez UTC comme source de vérité et nommez les champs explicitement (par exemple created_at_utc).
  • Ajoutez les champs réellement nécessaires : un temps d’événement en UTC (par exemple occurred_at_utc) et un tz_id quand le contexte local importe (utilisez un ID IANA comme America/New_York, pas un offset fixe).
  • Lors de l’entrée, collectez la date et l’heure locales plus tz_id, puis convertissez en UTC une seule fois à la frontière (API ou soumission). Ne convertissez pas plusieurs fois à différents niveaux.
  • Sauvegardez et requêtez en UTC. Convertissez en heure locale uniquement aux limites (UI, emails, exports).
  • Pour les actions critiques (paiements, conformité, planification), conservez aussi ce que vous avez reçu (chaîne locale originale, tz_id et l’UTC calculé). Cela fournit une piste d’audit en cas de contestation.

Exemple : un utilisateur planifie « 5 nov, 9:00 » en America/Los_Angeles. Vous stockez occurred_at_utc = 2026-11-05T17:00:00Z et tz_id = America/Los_Angeles. Même si les règles DST changent plus tard, vous pouvez toujours expliquer ce qu’il entendait et ce que vous avez stocké.

Si vous modélisez cela dans PostgreSQL (y compris via des outils visuels), rendez les types de colonnes explicites et cohérents, et imposez que votre application écrive en UTC à chaque fois.

Afficher l’heure locale de façon compréhensible pour les utilisateurs

Corriger le temps au niveau du schéma
Concevez des champs clairs pour timestamps et dates seules dans un modèle de données PostgreSQL visuel.
Modéliser les données

La plupart des bugs DST se voient dans l’interface, pas dans la base. Les gens lisent ce que vous affichez, le copient dans des messages et s’organisent en conséquence. Si l’écran est ambigu, les utilisateurs feront des suppositions erronées.

Quand le temps compte (réservations, tickets, rendez‑vous, fenêtres de livraison), affichez‑le comme un reçu : complet, précis et étiqueté.

Rendez l’affichage prévisible :

  • Affichez date + heure + fuseau (exemple : « 10 mars 2026, 9:30 America/New_York »).
  • Placez l’étiquette de fuseau près de l’heure, pas cachée dans les paramètres.
  • Si vous montrez un texte relatif (« dans 2 heures »), gardez l’horodatage exact à proximité.
  • Pour les éléments partagés, envisagez d’afficher à la fois l’heure locale du lecteur et le fuseau de l’événement.

Les cas limites DST nécessitent un comportement explicite. Si vous laissez l’utilisateur taper n’importe quelle heure, vous finirez par accepter une heure qui n’existe pas ou qui se produit deux fois.

  • Saut de printemps (heures manquantes) : bloquez les sélections invalides et proposez l’heure valide suivante.
  • Répétition d’automne (heures ambiguës) : affichez l’offset ou demandez un choix clair (par exemple « 1:30 AM UTC-4 » vs « 1:30 AM UTC-5 »).
  • Édition d’enregistrements existants : préservez l’instant original même si le format d’affichage change.

Exemple : un agent à Berlin planifie un appel avec un client à New York pour « 3 nov, 1:30 ». Pendant le retour d’heure, cette heure se produit deux fois à New York. Si l’UI affiche « 3 nov, 1:30 (UTC-4) », la confusion disparaît.

Construire des rapports qui ne trompent pas

Les rapports perdent la confiance quand les mêmes données donnent des totaux différents selon l’endroit d’où on les regarde. Pour éviter les bugs DST, définissez d’abord ce que signifie réellement « regrouper par jour », puis appliquez la règle de façon cohérente.

D’abord, choisissez la signification de « jour » pour chaque rapport. Une équipe support pense souvent en jour local du client. Les finances ont besoin du fuseau légal du compte. Certains rapports techniques sont plus sûrs en jours UTC.

Regrouper par jour local change les totaux autour du DST. Le jour du saut de printemps perd une heure locale. Le jour du retour d’heure double une heure locale. Si vous regroupez les événements par « date locale » sans règle claire, une heure chargée peut sembler manquante, doublée ou affectée au mauvais jour.

Règle pratique : chaque rapport a un fuseau de reporting unique, et il est visible dans l’en‑tête (par exemple, « Toutes les dates sont affichées en America/New_York »). Cela rend le calcul prévisible et donne au support quelque chose de clair à montrer.

Pour des équipes multi‑régions, laissez les gens changer le fuseau du rapport, mais traitez‑le comme une vue différente de la même vérité. Deux lecteurs pourront voir des buckets journaliers différents près de minuit et des transitions DST. C’est normal tant que le fuseau choisi est indiqué.

Quelques choix qui évitent la plupart des surprises :

  • Définissez la frontière du jour du rapport (fuseau utilisateur, fuseau du compte, ou UTC) et documentez‑le.
  • Utilisez un seul fuseau par exécution de rapport et affichez‑le à côté de la plage de dates.
  • Pour les totaux journaliers, regroupez par date locale dans le fuseau choisi (pas par date UTC).
  • Pour des graphiques horaires, étiquetez les heures répétées lors des retours d’heure.
  • Pour les durées, stockez et additionnez des secondes écoulées, puis formatez pour l’affichage.

Les durées demandent une attention particulière. Un « shift de 2 heures » qui traverse le retour d’heure dure 3 heures sur l’horloge murale mais reste 2 heures de temps écoulé si la personne a réellement travaillé 2 heures. Décidez ce que vos utilisateurs attendent, puis appliquez un arrondi cohérent (par exemple, arrondir après la somme, pas par ligne).

Pièges courants et comment les éviter

Lancer une application sûre pour le temps
Générez des backends, web et mobiles prêts pour la production tout en gardant les timestamps cohérents.
Construire l’app

Les bugs DST ne sont pas des « maths difficiles ». Ils viennent d’hypothèses discrètes qui s’installent avec le temps.

Un échec classique : sauvegarder un timestamp local tout en le marquant comme UTC. Tout semble correct jusqu’à ce qu’un autre utilisateur dans un fuseau différent ouvre l’enregistrement et que la valeur se décale silencieusement. La règle simple et sûre : stockez un instant (UTC) plus le contexte (fuseau de l’utilisateur ou du lieu) quand l’enregistrement a besoin d’un sens local.

Une autre source fréquente d’erreurs est l’utilisation d’offsets fixes comme -05:00. Les offsets ignorent les changements DST et les règles historiques. Utilisez de vrais IDs de fuseau IANA (par exemple America/New_York) pour que le système applique la règle correcte pour la date donnée.

Quelques habitudes simples évitent de nombreuses surprises de type « double‑shift » :

  • Convertissez seulement aux frontières : parsez l’entrée une fois, stockez une fois, affichez une fois.
  • Maintenez une ligne claire entre champs « instant » (UTC) et champs « horloge murale » (date/heure locale).
  • Stockez l’ID de fuseau auprès des enregistrements qui dépendent d’une interprétation locale.
  • Rendez le fuseau du serveur non pertinent en lisant et écrivant toujours en UTC.
  • Pour les rapports, définissez le fuseau du rapport et affichez‑le dans l’UI.

Surveillez aussi les conversions cachées. Un pattern courant : parsez une heure locale en UTC, puis une librairie UI suppose que la valeur est locale et la reconvertit. Le résultat est un saut d’une heure qui n’apparaît que pour certains utilisateurs et certaines dates.

Enfin, n’utilisez pas le fuseau de l’appareil client pour la facturation ou la conformité. Le téléphone d’un voyageur peut changer de zone en cours de route. Basez ces rapports sur une règle métier explicite, comme le fuseau du compte client ou l’emplacement d’un site.

Tests : les quelques cas qui attrapent la plupart des bugs

La plupart des bugs temporels n’apparaissent que quelques jours par an, d’où leur passage en QA. La solution : tester aux bons moments et rendre ces tests reproductibles.

Choisissez une zone qui observe DST (par exemple America/New_York ou Europe/Berlin) et écrivez des tests pour les deux jours de transition. Puis choisissez une zone sans DST (par exemple Asia/Singapore ou Africa/Nairobi) pour comparer et faire ressortir les différences.

Les 5 tests à garder pour toujours

  • Jour du saut de printemps : vérifier qu’on ne peut pas planifier l’heure manquante et que les conversions ne créent pas une heure inexistante.
  • Jour du retour d’heure : vérifier la duplication d’heure, où deux instants UTC différents s’affichent comme la même heure locale. Assurez‑vous que les logs et exports peuvent les distinguer.
  • Traversée de minuit : créer un événement qui passe minuit en heure locale, et confirmer que le tri et le groupement fonctionnent toujours vus en UTC.
  • Contraste non‑DST : répéter une conversion dans une zone sans DST et confirmer que les résultats restent stables sur les mêmes dates.
  • Instantanés de rapports : conserver des totaux attendus pour les rapports autour de la fin de mois et du week‑end DST, et comparer la sortie après chaque modification.

Un scénario concret

Imaginez qu’une équipe support planifie un suivi « 01:30 » la nuit du retour d’heure. Si votre UI ne stocke que l’heure locale affichée, vous ne pouvez pas savoir lequel des deux « 01:30 » était visé. Un bon test crée les deux timestamps UTC qui se mappent sur 01:30 localement et vérifie que l’application les garde distincts.

Ces tests montrent rapidement si votre système enregistre les bons faits (instant UTC, ID de zone, et parfois l’heure locale originale) et si les rapports restent honnêtes quand les horloges changent.

Checklist rapide avant livraison

Ajouter des temps que vous pouvez prouver
Créez une piste d’audit avec UTC stocké, ID de zone et saisie originale pour les timestamps contestés.
Commencer

Les bugs DST passent parce que l’application semble correcte la plupart des jours. Utilisez cette checklist avant de livrer quoi que ce soit affichant du temps, filtrant par date ou exportant des rapports.

  • Choisissez un fuseau de rapport unique pour chaque rapport (par exemple « fuseau du siège social » ou « fuseau de l’utilisateur »). Affichez‑le dans l’en‑tête et gardez‑le cohérent dans tableaux, totaux et graphiques.
  • Stockez chaque « instant dans le temps » en UTC (created_at, paid_at, message_sent_at). Stockez l’ID de fuseau IANA quand le contexte local importe.
  • N’utilisez pas d’offsets fixes comme « UTC-5 » si le DST peut s’appliquer. Convertissez en utilisant les règles du fuseau pour la date donnée.
  • Étiquetez clairement les heures partout (UI, emails, exports). Incluez date, heure et fuseau pour que les captures d’écran et CSVs ne soient pas mal lues.
  • Gardez un petit jeu de tests DST : un timestamp juste avant le saut de printemps, un juste après, et les mêmes autour de la répétition d’automne.

Contrôle de réalité : si un manager support à New York exporte « Tickets créés dimanche » et qu’un collègue à Londres ouvre le fichier, les deux doivent pouvoir dire quel fuseau représente les timestamps sans deviner.

Exemple : un flux support réel entre fuseaux

Construire une planification plus intelligente
Créez des flux de planification qui conservent l’intention locale et le contexte de zone, sans code personnalisé.
Commencer à construire

Un client à New York ouvre un ticket pendant la semaine où les États‑Unis sont passés à l’heure d’été mais pas encore le Royaume‑Uni. Votre équipe support est à Londres.

Le 12 mars, le client soumet le ticket à 09:30 heure locale New York. Cet instant est 13:30 UTC, parce que New York est maintenant UTC-4. Un agent à Londres répond à 14:10 heure de Londres, ce qui est 14:10 UTC (Londres est encore UTC+0 cette semaine). La réponse est venue 40 minutes après la création du ticket.

Voici ce qui tourne mal si vous ne sauvegardez que l’heure locale sans ID de zone :

  • Vous enregistrez « 09:30 » et « 14:10 » comme timestamps bruts.
  • Un job de rapport suppose plus tard que « New York est toujours UTC-5 » (ou utilise le fuseau du serveur).
  • Il convertit 09:30 en 14:30 UTC au lieu de 13:30 UTC.
  • Votre horloge SLA est faussée d’une heure, et un ticket respectant un SLA de 2 heures peut être marqué en retard.

Le modèle sûr : conservez l’instant en UTC et l’ID IANA pertinent (par exemple America/New_York pour le client, Europe/London pour l’agent). Dans l’UI, affichez ce même instant UTC dans le fuseau du lecteur en utilisant les règles stockées pour la date.

Pour le rapport hebdomadaire, choisissez une règle claire comme « grouper par jour local du client ». Calculez les bornes de jour en America/New_York (minuit à minuit), convertissez ces bornes en UTC, puis comptez les tickets qui s’y trouvent. Les chiffres restent stables, même pendant les semaines de DST.

Prochaines étapes : homogénéiser la gestion du temps dans votre appli

Si votre produit a déjà souffert de bugs DST, la façon la plus rapide d’en sortir est d’écrire quelques règles et de les appliquer partout. « Presque cohérent » est l’endroit où vivent les problèmes temporels.

Gardez les règles courtes et précises :

  • Format de stockage : ce que vous stockez (généralement un instant en UTC) et ce que vous n’enregistrez jamais (heure locale ambiguë sans zone).
  • Fuseau de rapport : quel fuseau les rapports utilisent par défaut et comment les utilisateurs peuvent le modifier.
  • Étiquetage UI : ce qui apparaît à côté des heures (par ex. « 10 mars, 09:00 (America/New_York) » vs simplement « 09:00 »).
  • Règles d’arrondi : comment vous regroupez le temps (heure, jour, semaine) et quel fuseau ces buckets suivent.
  • Champs d’audit : quels timestamps signifient « événement survenu » vs « enregistrement créé/modifié ».

Déployez‑les de façon progressive. Corrigez d’abord les nouveaux enregistrements pour arrêter la propagation du problème. Puis migrez les données historiques par lots. Pendant la migration, conservez la valeur originale (si elle existe) et la valeur normalisée assez longtemps pour repérer les différences dans les rapports.

Si vous utilisez AppMaster (appmaster.io), un bénéfice pratique est de centraliser ces règles dans votre modèle de données et votre logique métier partagée : stockez les timestamps en UTC de façon cohérente, conservez les IDs de fuseau IANA avec les enregistrements nécessitant un sens local, et appliquez les conversions aux limites d’entrée et d’affichage.

Une étape concrète suivante consiste à construire un rapport sûr pour les fuseaux (par exemple « tickets résolus par jour ») et à le valider avec les cas de test ci‑dessus. S’il reste correct pendant une semaine de changement DST pour deux fuseaux différents, vous êtes en bonne voie.

FAQ

Pourquoi les bugs DST arrivent-ils même quand le code semble correct ?

Les changements d’heure modifient l’offset local, pas le moment réel où un événement s’est produit. Si vous traitez une lecture d’horloge locale comme si c’était un instant absolu, vous verrez des heures « manquantes » au printemps et des heures « dupliquées » à l’automne.

Quelle est la façon la plus sûre de stocker des timestamps dans une base de données ?

Stockez les événements réels comme un instant absolu en UTC, ainsi la valeur ne change pas quand les offsets évoluent. Convertissez ensuite vers le fuseau local du lecteur uniquement lors de l’affichage, en utilisant un vrai ID de zone.

Pourquoi ne puis‑je pas stocker seulement un offset UTC au lieu d’un nom de zone ?

Un offset comme -05:00 ne décrit la différence par rapport à l’UTC qu’à un instant donné et n’inclut pas les règles DST ni l’historique. Un ID de zone IANA comme America/New_York contient l’ensemble des règles, donc les conversions restent correctes pour différentes dates.

Quand dois‑je stocker une valeur comme date plutôt que comme timestamp ?

Stockez comme date les valeurs qui ne sont pas des instants réels, par exemple les anniversaires, dates de renouvellement ou échéances de facture. Si vous les stockez comme timestamp, les conversions de fuseau peuvent les faire passer au jour précédent ou suivant.

Comment mon application doit‑elle gérer les heures sautées ou répétées lors des changements DST ?

Le passage à l’heure d’été crée des heures locales qui n’existent pas — l’application doit bloquer ces sélections invalides et proposer l’heure valide suivante. Le passage à l’heure d’hiver crée une heure répétée — l’interface doit permettre à l’utilisateur de préciser quelle occurrence il entend, par exemple en affichant l’offset.

Dois‑je convertir les réunions planifiées en UTC lorsqu’on les enregistre ?

Pour la planification, conservez l’intention locale : stockez la date et l’heure locales prévues ainsi que l’ID de zone. Vous pouvez aussi garder un instant UTC dérivé pour l’exécution, mais ne jetez pas l’intention locale originale au risque de perdre du sens si les règles changent.

Comment éviter que les rapports n’affichent des totaux journaliers différents selon les utilisateurs ?

Choisissez un fuseau de rapport par rapport et affichez‑le clairement, afin que tout le monde sache ce que signifie « jour ». Le groupement par jour local peut donner des journées de 23 ou 25 heures près des transitions DST — c’est acceptable tant que le fuseau est indiqué et appliqué de façon cohérente.

Quelle est l’erreur la plus courante qui cause le bug du « décalage d’une heure » ?

La conversion double est la cause la plus fréquente : parsez la saisie une fois, stockez une fois, et formatez une fois pour l’affichage. Les décalages d’une heure surviennent quand une couche suppose que la valeur est locale et une autre qu’elle est en UTC.

Comment dois‑je calculer les durées qui traversent des changements DST ?

Stockez le temps écoulé en secondes (ou une autre unité absolue) et additionnez ces valeurs, puis formatez le résultat pour l’affichage. Décidez si vous parlez de temps écoulé ou d’heures d’horloge murale avant d’implémenter paie, SLA ou durées de shift, puisque les nuits DST peuvent rendre les heures d’horloge différentes.

Quels tests attrapent la plupart des bugs DST avant que les clients ne les voient ?

Testez les deux jours de transition DST dans au moins une zone qui observe DST et comparez avec une zone qui n’en observe pas pour trouver les hypothèses erronées. Incluez les cas d’heure manquante, d’heure répétée, d’événements proches de minuit et de regroupement pour les rapports, car c’est là que les bugs apparaissent généralement.

Facile à démarrer
Créer quelque chose d'incroyable

Expérimentez avec AppMaster avec un plan gratuit.
Lorsque vous serez prêt, vous pourrez choisir l'abonnement approprié.

Démarrer