Skip to content
industry insights

La classe Date de JavaScript est défectueuse

Votre code cache probablement des bugs subtils liés aux dates que les tests unitaires ne détecteront pas. La raison est un défaut de conception fondamental dans l'objet global le plus courant, et le plus maudit, de JavaScript.

Cassidy Wolfe
La classe Date de JavaScript est défectueuse

Le paradoxe du « Zéro » : une première impression défectueuse

La classe Date de JavaScript est fondamentalement défectueuse, une relique générant plus de frustration que d'utilité. Un quiz rapide de la vidéo de Better Stack « How well do you know JavaScript's Date class? » expose immédiatement ce défaut systémique. Demandez new Date('0'), et vous obtenez l'année 2000. Pourtant, new Date(0) renvoie correctement l'époque Unix, le 1er janvier 1970, 00:00:00 UTC. La distinction entre une chaîne de caractères et un nombre dicte ici une différence de trente ans, une première impression vraiment déconcertante.

La confusion ne fait que s'accentuer avec Date.parse(). Cette méthode fonctionne exclusivement sur des chaînes de caractères, ce qui signifie que Date.parse(0) convertit d'abord le nombre 0 en la chaîne '0'. Par conséquent, Date.parse('0') et Date.parse(0) produisent tous deux l'année 2000. La logique sous-jacente, si elle existe, reste obscure, forçant les développeurs à une vigilance constante contre les conversions inattendues.

L'absurdité s'étend au-delà du zéro. Considérez new Date('2'). On pourrait s'attendre à une erreur ou peut-être à l'époque, mais JavaScript interprète cela comme février 2001. Une telle analyse arbitraire découle de ce qui ne peut être décrit que comme des heuristiques spécifiques à l'implémentation, où les chaînes à un seul chiffre deviennent de manière ambiguë des années ou des mois. Cette imprévisibilité fait de l'objet Date un champ de mines, et non un outil.

Un champ de mines de mutabilité et de fuseaux horaires

Au-delà des bizarreries d'analyse, l'objet Date de JavaScript recèle des défauts de conception fondamentaux qui en font une source constante de frustration. Sa mutabilité est un coupable principal. Des méthodes comme setDate() ou setMonth() modifient directement l'instance Date, entraînant des effets secondaires insidieux dans toute une application. Passez un objet Date à une fonction, modifiez-le, et soudainement la référence originale a changé sans avertissement explicite, créant des cauchemars de débogage.

Ensuite, il y a les fameux problèmes de fuseaux horaires. L'objet Date se convertit agressivement vers et depuis le fuseau horaire local de l'utilisateur, provoquant des erreurs omniprésentes de décalage d'un jour. Une date créée à partir d'une chaîne UTC peut sembler correcte, mais les appels ultérieurs à getDate() ou getMonth() peuvent renvoyer un jour ou un mois totalement différent si le décalage local la fait basculer au-delà de minuit. Cette ambiguïté entre l'heure locale et l'heure UTC est un piège constant.

Enfin, l'API elle-même est un modèle de mauvaise conception. Les mois sont indexés à partir de zéro, ce qui signifie que janvier est 0 et décembre est 11 — une source classique de bugs exigeant un calcul mental constant. Pire encore, l'objet Date gère les valeurs invalides avec un « dépassement » silencieux, et non des erreurs. Essayez new Date(2023, 0, 32) : au lieu de lever une exception pour le 32 janvier, il bascule au 1er février 2023, masquant les mauvaises données et permettant aux dates incorrectes de se propager silencieusement.

Temporal : la solution moderne que nous méritons

Le règne de l'erreur de l'objet Date touche enfin à sa fin. Après des décennies de développeurs luttant contre son comportement erratique, le remplaçant officiel et moderne de JavaScript, Temporal, est là pour corriger le tir. Il ne s'agit pas simplement d'une mise à niveau ; c'est un changement de paradigme fondamental, méticuleusement conçu pour résoudre les défauts de conception de base qui ont tourmenté JavaScript depuis sa création.

L'avantage le plus crucial de Temporal est son adoption d'objets immuables. Cette conception prévient les effets de bord silencieux et difficiles à déboguer, courants avec l'objet mutable Date, garantissant que les opérations renvoient toujours de nouvelles instances plutôt que de modifier celles existantes. De plus, les développeurs obtiennent enfin un contrôle explicite et sans ambiguïté sur la gestion des fuseaux horaires. Cela élimine les conjectures et les conversions inattendues qui tourmentent depuis longtemps les applications visant une précision mondiale.

Au-delà de l'immuabilité, Temporal introduit une suite puissante de types d'objets précis, chacun conçu pour modéliser avec précision des concepts temporels spécifiques. Les développeurs ne sont plus obligés de faire entrer chaque scénario de date-heure dans un seul objet Date surchargé. Temporal propose des types dédiés tels que :

  • Temporal.PlainDate pour les dates sans contexte de temps ou de fuseau horaire.
  • Temporal.PlainTime pour les heures sans contexte de date ou de fuseau horaire.
  • Temporal.ZonedDateTime pour un moment précis dans le temps, lié à un fuseau horaire et un calendrier.

Ces objets spécialisés offrent une clarté et un contrôle inégalés, contrastant fortement avec les difficultés inhérentes à l'objet Date hérité. Pour explorer davantage les incohérences notoires de l'objet Date, consultez Date - JavaScript | MDN.

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

Comment échapper au piège de Date dès aujourd'hui

Développeurs, le temps des excuses est révolu. Bien que Temporal reste une proposition de stade 3, des polyfills stables comme tc39/proposal-temporal le rendent parfaitement prêt pour la production dès aujourd'hui. Vous n'avez plus besoin de différer une gestion robuste des dates en attendant une ubiquité native dans les navigateurs. Adoptez dès maintenant le futur de la gestion des dates et heures en JavaScript pour construire des applications nettement plus fiables.

Considérez le piège courant et frustrant consistant à ajouter un mois à une date. L'objet Date intégré de JavaScript, avec sa mutabilité inhérente et ses bizarreries de calendrier souvent déconcertantes, donne fréquemment des résultats surprenants et incorrects. Par exemple, tenter d'ajouter un mois au 31 janvier 2023 en utilisant new Date(2023, 0, 31).setMonth(1) mute de manière désastreuse l'objet date au 2 mars 2023, au lieu du 28 ou 29 février attendu. Temporal, en revanche, offre clarté et prévisibilité :

// Avant : Date boguée
const d = new Date(2023, 0, 31);
d.setMonth(d.getMonth() + 1); // Mute au 2 mars 2023

// Après : Temporal propre
const plainDate = Temporal.PlainDate.from('2023-01-31');
const nextMonth = plainDate.add({ months: 1 }); // Correctement le 28 février 2023

Cette différence marquée souligne la conception immuable et l'arithmétique prévisible de Temporal. L'API gère systématiquement les dépassements de calendrier et les fuseaux horaires sans pièges cachés. Il est temps de se débarrasser de la dépendance aux bibliothèques tierces souvent surdimensionnées qui ne font que corriger les lacunes natives, ajoutant une taille de bundle et une complexité inutiles. Commencez à apprendre ce standard officiel et futuriste. Écrivez une logique de date qui est vraiment lisible, démontrablement moins sujette aux erreurs et conçue pour durer, libérant votre base de code d'une décennie de maux de tête liés aux dates.

Questions fréquemment posées

Pourquoi new Date('0') renvoie-t-il l'année 2000 en JavaScript ?

Cela est dû à des règles d'analyse incohérentes et spécifiques à l'implémentation dans le moteur JavaScript. Les chaînes courtes et ambiguës ne sont pas traitées selon une norme claire, ce qui conduit à des résultats inattendus comme '0' interprété comme l'année 2000.

Qu'est-ce que l'API Temporal ?

Temporal est une API JavaScript moderne et intégrée, conçue pour remplacer complètement l'objet Date défectueux. Elle offre des objets immuables, une gestion explicite des fuseaux horaires et un ensemble d'outils prévisibles et robustes pour la manipulation des dates et des heures.

L'API Temporal est-elle prête à être utilisée en production ?

En tant que proposition TC39 Stage 3, l'API Temporal est stable mais n'est pas encore disponible nativement dans tous les navigateurs. Les développeurs peuvent l'utiliser dès aujourd'hui via des polyfills officiels, ce qui leur permet d'écrire du code pérenne et de bénéficier immédiatement de ses avantages.

En quoi Temporal est-il meilleur que des bibliothèques comme Day.js ou date-fns ?

Bien que des bibliothèques comme Day.js offrent d'excellentes solutions de contournement, elles augmentent la taille du bundle de votre application. Temporal sera une solution native et standardisée intégrée directement au langage JavaScript, offrant de meilleures performances et éliminant le besoin de dépendances tierces.

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