Skip to content
tutorials

L'enfer des dates en JavaScript est enfin terminé

Pendant 30 ans, l'objet Date de JavaScript a été une usine à bugs silencieuse dans votre code. Le remplaçant tant attendu ne se contente pas de corriger les erreurs : il change fondamentalement votre façon de concevoir le temps.

Marcus Lee
L'enfer des dates en JavaScript est enfin terminé

Pourquoi des décennies de bugs liés aux dates n'étaient pas de votre faute

Pendant des décennies, les développeurs JavaScript ont lutté avec l'objet natif Date, non par manque de compétence, mais à cause de ses défauts de conception fondamentaux. Sa mutabilité signifiait que le passage d'un objet Date pouvait modifier silencieusement l'original, créant des effets secondaires difficiles à tracer et des comportements inattendus. De plus, les mois étaient indexés à zéro (janvier est 0, décembre 11), un système contre-intuitif qui menait systématiquement à des erreurs de type « off-by-one », déconcertant même les programmeurs chevronnés.

Plus difficile encore était la dépendance de Date au fuseau horaire local du système de l'utilisateur. Cela créait un champ de mines pour les applications mondiales, où un événement à « 9h » pouvait changer de manière imprévisible d'heures ou de jours selon les régions, surtout lors des transitions vers l'heure d'été (DST). De telles hypothèses implicites rendaient le calcul d'heures cohérentes entre différents lieux ou le stockage d'un point fixe dans le temps quasi impossible sans aide extérieure.

Face à ces complexités, les développeurs ont adopté un écosystème tentaculaire de « bibliothèques pansements » externes comme Moment.js et Luxon. Ces outils offraient un soulagement indispensable, fournissant une manipulation des dates et des heures plus robuste. Cependant, ils introduisaient leur propre surcharge : augmentation de la taille du bundle, gestion complexe des dépendances et abstraction ajoutée. C'est devenu la norme pendant des années, reflétant l'inadéquation de l'objet Date natif, et non les capacités des développeurs.

Penser en termes de temps, pas seulement en horodatages

Temporal résout les problèmes de dates de JavaScript en adoptant une philosophie de conception fondamentale : des objets distincts et immuables pour des concepts distincts. Cette approche impose la clarté, empêchant les effets secondaires silencieux et la confusion qui tourmentaient l'objet Date original lorsqu'il essayait de tout faire à la fois. Fini les devinettes pour savoir si une fonction a modifié votre date de manière inattendue.

Au lieu d'un objet unique surchargé, Temporal propose des types spécialisés, chacun gérant un aspect spécifique du temps. Cette séparation claire empêche les erreurs par conception, garantissant que vous utilisez le bon outil pour le travail :

  • Temporal.PlainDate : Représente une date civile sans heure ni fuseau horaire.
  • Temporal.PlainTime : Capture une heure d'horloge, indépendante des dates.
  • Temporal.Instant : Un point dans le temps universel et sans ambiguïté, mesuré en nanosecondes depuis l'époque Unix.
  • Temporal.ZonedDateTime : Une date et une heure complètes, ancrées dans un fuseau horaire spécifique, comprenant parfaitement les complexités telles que l'heure d'été.

De plus, Temporal.Duration révolutionne l'arithmétique des dates. Il remplace les calculs manuels en millisecondes sujets aux erreurs par des opérations lisibles par l'humain, vous permettant d'ajouter ou de soustraire fluidement des périodes comme date.add({ months: 2, days: 10 }). Cette précision et cette lisibilité rendent les calculs temporels complexes, tels que ceux couvrant les transitions vers l'heure d'été, remarquablement simples et fiables.

Comment Temporal conquiert l'heure d'été

Imaginez un vol de New York à Londres, partant à 20h00 heure de New York le samedi 24 octobre, avec une durée de vol de 7 heures. Un calcul simple pourrait suggérer une arrivée à 3h00 du matin heure de New York, ce qui correspondrait à 8h00 à Londres (en tenant compte d'un décalage de 5 heures). Cependant, les horloges de Londres reculent d'une heure cette nuit-là pour l'heure d'été.

Un calcul de date naïf donnerait une arrivée incorrecte à 8h00. Temporal.ZonedDateTime comprend ce détail critique, calculant automatiquement l'heure d'arrivée correcte à 7h00. Il modélise avec précision le temps dans une région géographique spécifique, éliminant les incertitudes liées aux transitions délicates.

Temporal atteint cette précision en exploitant la IANA time zone database en arrière-plan. Cette base de données mondialement reconnue, également utilisée par les systèmes d'exploitation et les serveurs, fournit des informations précises et à jour sur tous les fuseaux horaires ainsi que sur leurs changements d'heure d'été (DST) passés et futurs. C'est une solution robuste qui évite aux développeurs de devoir gérer eux-mêmes des règles de fuseaux horaires complexes. Pour en savoir plus sur les capacités de Temporal, consultez la documentation Temporal - JavaScript - MDN Web Docs.

Temporal propose également des outils d'inspection puissants. Les développeurs peuvent utiliser getTimeZoneTransition pour interroger explicitement les moments où les changements d'heure d'été se produisent, offrant ainsi une transparence totale sur la logique. Cette fonctionnalité facilite considérablement le débogage de scénarios complexes basés sur le temps.

Cet article vous plaît ? Recevez-en un comme celui-ci chaque matin.

un e-mail par jour · désinscription en deux clics · aucun traqueur tiers

Vous pouvez commencer à utiliser Temporal dès aujourd'hui

Temporal n'est plus un rêve lointain ; c'est une fonctionnalité stable et aboutie, prête pour les développeurs. Elle a atteint le statut TC39 Stage 4, le plus haut niveau de maturité, signifiant son achèvement et sa préparation pour l'inclusion dans le standard ECMAScript. Les développeurs peuvent s'attendre à ce que Temporal soit officiellement intégré dans ECMAScript 2027, ce qui témoigne de sa conception robuste et de son large consensus. Cela signifie que vous adoptez une API pérenne.

Le support natif de Temporal est déjà largement répandu parmi les principaux navigateurs et environnements d'exécution. Chrome, Firefox et Edge l'ont implémenté nativement, offrant une expérience fluide. Node.js prend également en charge Temporal, bien qu'il nécessite un flag expérimental pour le moment. Safari reste le dernier navigateur majeur à l'intégrer pleinement, bien que vous puissiez explorer ses capacités dès aujourd'hui dans Safari Technology Preview.

Vous n'avez pas besoin d'attendre un support natif complet partout pour commencer à tirer parti de la puissance de Temporal. Commencez à l'utiliser dès aujourd'hui en installant le polyfill officiel @js-temporal/polyfill. Ce polyfill garantit que votre code s'exécute de manière cohérente dans tous les environnements, vous immunisant contre les maux de tête liés à l'objet Date historique. Adoptez dès maintenant des concepts temporels clairs et immuables, et préparez vos applications pour l'avenir.

Foire aux questions

Qu'est-ce que l'API Temporal en JavaScript ?

Temporal est une nouvelle API JavaScript intégrée, conçue pour être un remplacement moderne et robuste de l'objet Date historique. Elle fournit un ensemble complet d'outils pour travailler avec les dates et les heures, avec une prise en charge native des fuseaux horaires.

Pourquoi l'API Temporal est-elle meilleure que l'ancien objet Date ?

Temporal améliore l'objet Date sur plusieurs points clés : ses objets sont immuables pour éviter les bugs accidentels, elle utilise des types distincts pour différents concepts (par exemple, PlainDate, PlainTime), et elle offre une prise en charge explicite et fiable des fuseaux horaires et de l'heure d'été.

Temporal remplace-t-il des bibliothèques comme Moment.js ou Luxon ?

Pour de nombreux cas d'usage courants, oui. Temporal fournit une solution native et standardisée pour les manipulations de dates et d'heures qui nécessitaient auparavant des bibliothèques tierces, éliminant ainsi le besoin de dépendances supplémentaires et réduisant la taille des bundles.

Quand l'API Temporal sera-t-elle disponible dans tous les navigateurs ?

Temporal fait partie du standard ES2027 et est déjà pris en charge nativement dans Chrome, Firefox et Edge. En attendant un support natif complet dans Safari, les développeurs peuvent utiliser le polyfill officiel @js-temporal/polyfill pour commencer à l'utiliser dans tous les environnements dès aujourd'hui.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only