Date de JavaScript est enfin remplacé par Temporal. Fruit de 9 ans de travail, cette nouvelle API apporte l'immutabilité, la précision à la nanoseconde et une gestion native des fuseaux horaires — intégrée dans ECMAScript 2026.
Depuis 1995, l'objet Date est le cauchemar silencieux des développeurs JavaScript. Conçu en seulement dix jours par Brendan Eich pour "Mocha" (l'ancêtre de JS), cet outil était un portage direct et hâtif de l'implémentation Java. Cet héritage précipité a engendré des décennies de bugs complexes. Mais en mars 2026, une page se tourne : la proposition Temporal est officiellement passée à l'étape 4 du processus TC39, intégrant désormais la spécification ECMAScript 2026.
Pourquoi l'objet Date était-il une plaie ?
Les défauts de l'objet Date ne sont pas de simples détails techniques, ce sont des pièges structurels qui ont forcé des millions de développeurs à utiliser des bibliothèques externes comme Moment.js. Voici pourquoi il fallait tout changer :
- L'indexation des mois absurde : janvier vaut
0et décembre vaut11— source d'erreurs d'inattention inépuisable. - La mutabilité dangereuse : modifier une date altère l'objet original en place. Si vous passez une date à une fonction qui la modifie, l'original est perdu.
- Une arithmétique bancale : ajouter un mois au 31 janvier renvoie souvent le 2 mars, ignorant la réalité du calendrier.
- Aucune gestion de fuseaux : chaque navigateur interprète différemment les chaînes ambiguës proches d'ISO 8601.
- Le manque de précision :
Datese limite aux millisecondes, un frein majeur pour la finance et la science.
Le processus TC39 : 9 ans et 6 étapes
Face à ce constat, Maggie Johnson-Pint (Microsoft) et d'autres membres du TC39 ont lancé le projet Temporal en 2017. Le processus TC39 se déroule désormais en 6 étapes : stade 0 (idée), stade 1 (acceptation du problème), stade 2 (conception), stade 2.7 (approbation de principe avant implémentation), stade 3 (implémentation et revue), puis stade 4 (standardisation).
Validé lors de la plénière de mars 2026, Temporal est la plus grande mise à jour d'ECMAScript depuis ES2015. Elle s'accompagne de 4 500 tests rigoureux (contre seulement 594 pour Date). Ce travail de titan a été soutenu par Bloomberg, dont le terminal financier ne pouvait plus tolérer les bugs de fuseaux, en partenariat avec la société espagnole Igalia, Google, Microsoft et des bénévoles de l'Université de Bergen qui ont co-développé temporal_rs — le cœur d'implémentation en Rust partagé entre Chrome et Firefox.
Ce que Temporal change concrètement
1. Immutabilité totale
Fini les modifications involontaires. Chaque opération sur un objet Temporal renvoie une nouvelle instance. Votre date de départ reste intacte quoi qu'il arrive.
2. Gestion native des fuseaux horaires
Temporal.ZonedDateTime intègre nativement son fuseau et gère automatiquement les transitions heure d'été / hiver. Plus besoin de calculer manuellement les offsets.
3. Précision à la nanoseconde
Pour répondre aux besoins de la tech moderne, Temporal descend jusqu'à la nanoseconde — indispensable pour les transactions haute fréquence ou la recherche scientifique.
4. Calendriers non-grégoriens natifs
Japonais, hébreu, islamique (hijri), chinois… Temporal les gère tous nativement via Intl.era et Intl.monthCode. Un avantage majeur pour les applications internationales.
Exemples de code : Date ❌ vs Temporal ✅
// ❌ AVANT — Date : mutable et piégeux
const date = new Date(2026, 0, 31); // janvier = 0 !
date.setMonth(date.getMonth() + 1);
console.log(date); // → 2 mars ❌ (pas 28 fév)
// ✅ APRÈS — Temporal : immutable et prévisible
const date = Temporal.PlainDate.from('2026-01-31');
const nextMonth = date.add({ months: 1 });
console.log(nextMonth.toString()); // → "2026-02-28" ✅
// Heure actuelle avec fuseau automatique
const now = Temporal.Now.zonedDateTimeISO();
console.log(now.toString());
// → "2026-04-25T13:14:00+01:00[Africa/Algiers]"
// Calcul d'âge précis sans bibliothèque externe
const birth = Temporal.PlainDate.from('2000-05-10');
const today = Temporal.Now.plainDateISO();
const age = birth.until(today);
console.log(`${age.years} ans`); // → "25 ans"
// Calendrier hébreu
const hebrewDate = Temporal.PlainDate.from({
calendar: 'hebrew', year: 5786, month: 7, day: 27
});
console.log(hebrewDate.toString()); // → "5786-07-27[u-ca=hebrew]"
Comparatif : Date (1995) vs Temporal (2026)
| Aspect | Date 1995 | Temporal 2026 |
|---|---|---|
| Création | Portage Java en 10 jours | Spécification développée pendant 9 ans |
| Mutabilité | Objet mutable, modifications involontaires possibles | Objets immuables, chaque opération renvoie une nouvelle instance |
| Fuseaux horaires | Aucun support natif, comportements divergents | ZonedDateTime intègre le fuseau et gère l'heure d'été |
| Calendriers | Grégorien uniquement | Japonais, hébreu, islamique, chinois… |
| Précision | Milliseconde | Nanoseconde |
| Tests (Test262) | ~594 tests | ~4 500 tests |
| Mois indexation | 0 = janvier (piège !) | 1 = janvier (logique) |
Disponibilité en 2026
Temporal est disponible nativement dans les environnements suivants sans polyfill :
Pour les environnements anciens, un polyfill officiel est maintenu par les champions du projet. La migration depuis Moment.js se fait progressivement, module par module.
temporal-fun émergent pour faciliter l'usage au quotidien.
Un nouveau marché pour les développeurs
- Services de migration : des millions de projets doivent encore abandonner Moment.js. Des freelances facturent déjà plusieurs milliers d'euros pour auditer et migrer des codebases critiques.
- Consulting international : Temporal gère enfin les calendriers hijri, hébreu ou japonais. Les banques et administrations du Moyen-Orient ou d'Asie recherchent activement des experts.
- Composants premium : de nouveaux widgets de planification compatibles Temporal se vendent entre 29 $ et 49 $ sur les plateformes No-Code.
- Formations et cours : comme pour ES6 en son temps, des cours en ligne sur Temporal attirent déjà des milliers d'apprenants.
FAQ
Date qui reste disponible. Migrez progressivement les modules les plus critiques en commençant par les calculs de fuseaux horaires.Temporal.Now.zonedDateTimeISO() dans votre console Chrome 144 ou Firefox 139, et partagez votre retour en commentaire !

0 Commentaires