- La nouvelle norme Temporal API, qui remplace en profondeur les limites de l’objet Date en JavaScript, a atteint le stade 4 d’ECMAScript après 9 ans de développement
- Temporal fournit des types immuables, une prise en charge explicite des fuseaux horaires et des calendriers, ainsi qu’une précision à la nanoseconde, éliminant les ambiguïtés et les erreurs de l’ancien
Date
- Bloomberg, Igalia, Microsoft, Google, Mozilla et d’autres acteurs ont collaboré à la conception de la spécification et à son implémentation, avec la bibliothèque commune en Rust
temporal_rs pour permettre une coopération entre plusieurs moteurs
- Temporal prend en charge avec précision les calculs temporels et les calendriers internationaux grâce à des types détaillés comme ZonedDateTime, Instant, PlainDate/Time, Duration
- Cette norme, qui résout des problèmes vieux de 30 ans, est considérée comme un exemple réussi de collaboration et d’innovation ouverte dans l’écosystème JavaScript
Les problèmes de gestion du temps en JavaScript et l’arrivée de Temporal
- L’ancien objet Date, simple portage du
Date de Java en 1995, est depuis des décennies une source de bugs à cause de sa mutabilité, de calculs de mois incohérents et d’un parsing ambigu
- Exemple : erreurs de calcul en fin de mois avec
setMonth, résultats différents selon les navigateurs lors du parsing de chaînes proches du format ISO
- À partir des années 2010, à mesure que les applications web se sont complexifiées, les limites de
Date se sont aggravées
- Les développeurs ont compensé avec des bibliothèques externes comme Moment.js, au prix d’une augmentation de la taille des bundles et d’une charge de maintenance supplémentaire
- En 2017, Maggie Johnson-Pint a soumis à TC39 la proposition Temporal, lançant le processus de standardisation
La collaboration entre TC39 et l’industrie
- Temporal a commencé en stage 1 en 2018 et a atteint le stage 4 (standardisation) au terme d’un parcours de 9 ans
- Bloomberg a participé activement pour résoudre les problèmes de fuseau horaire et de précision dans des environnements JavaScript à grande échelle
- Exigences : fuseaux horaires personnalisés, exactitude historique basée sur l’IANA, précision à la nanoseconde
- La spécification et l’implémentation ont été menées en collaboration avec Igalia, Microsoft, Google, Mozilla et d’autres
- Plusieurs ingénieurs ont participé comme champions, dont Philipp Dunkel, Ujjwal Sharma, Philip Chimento, Shane Carr, Justin Grant
Les principaux types et fonctionnalités de Temporal
- Temporal.ZonedDateTime : représentation immuable d’un instant avec fuseau horaire, calendrier et ajustement explicite de l’heure d’été
- Exemple : lors du passage à l’heure d’été à Londres, si
01:30 n’existe pas, la valeur est automatiquement ajustée à 02:30
- Temporal.Instant : représentation d’un instant absolu sans fuseau horaire ni calendrier, avec précision à la nanoseconde
- Le même instant peut être converti vers plusieurs fuseaux horaires
- PlainDate / PlainTime / PlainDateTime / PlainYearMonth / PlainMonthDay : types « horloge murale » sans fuseau horaire
- Adaptés à l’affichage simple de dates et heures ou à leurs calculs
- Temporal.Duration : représentation d’un intervalle de temps, avec conversion possible entre différentes unités (
total({ unit: "second" }))
- Prise en charge des calendriers : exécution correcte d’opérations sur des calendriers non grégoriens, comme le calendrier hébraïque
Implémentation et processus de standardisation
- Temporal constitue l’ajout de spécification le plus important de l’histoire d’ECMAScript, avec environ 4 500 cas de test
- Une implémentation commune en Rust,
temporal_rs, a été développée et utilisée conjointement par plusieurs moteurs comme V8 et Boa
- Avantages : réduction de la barrière à l’entrée, maintenance à long terme facilitée, amélioration de la qualité du code
- Entre 2024 et 2025,
temporal_rs a atteint 100 % de réussite aux tests et est considéré comme un exemple réussi de collaboration multi-moteurs
État du support et défis à venir
- Temporal est déjà pris en charge par Firefox 139, Chrome/Edge 144 et TypeScript 6.0 Beta
- Safari en est au stade de préversion technique, et Node.js 26 est prévu
- Le principal défi à venir est l’intégration avec les API Web
- Exemple : prise en charge des types
Temporal dans les éléments de formulaire comme <input type="date">
- Étude de son potentiel pour remplacer
DOMHighResTimeStamp (avec l’exemple d’utilisation de Temporal.Now.instant())
Les résultats de la collaboration et de l’innovation ouverte
- Temporal est une norme finalisée grâce à 9 années de collaboration entre plusieurs organisations, avec la participation de
- Microsoft, Google, Mozilla, Bloomberg, Igalia, Boa et d’autres acteurs
temporal_rs est considéré comme un exemple réussi de modèle d’infrastructure partagée, qui a
- réduit les coûts d’implémentation redondants, amélioré la cohérence et accéléré l’innovation
- Au-delà d’une simple amélioration d’API, Temporal est vu comme la preuve d’un effort collectif de la communauté JavaScript pour résorber une dette technique de long terme
- Après 30 ans, JavaScript dispose enfin d’une API moderne pour les dates et les heures
7 commentaires
La complexité des calculs temporels vient bien plus de la philosophie humaine, de la précision de l’astronomie et de la culture que d’un simple problème de format. Le calcul, lui, est facile même avec un simple
long. Historiquement, sur la ligne du temps, il existe de nombreuses zones particulières où 1 + 1 ne fait pas 2, et cela vient en grande partie des calendriers, comparables au I Ching, qui varient selon la position, comme l’angle du soleil et de la surface terrestre. Dans ce genre de cas, le calendrier luni-solaire coréen n’a jamais même été pris en compte dans la discussion.Et c’est l’Institut coréen de recherche en astronomie et sciences spatiales qui le détermine.
Enfin ! Quel bonheur !!
Enfin !!
ZonedDateTime...? Ne me dis pas que toi aussi... !
Enfin.
Le parcours est donc le suivant.
C
time.h-> Javajava.util.Date->Datede JSjoda-timede Java -> JSR 310 ->java.time-> moment.js ->
Temporalde JSCommentaires sur Hacker News
La distinction entre un instant et un datetime basé sur le calendrier permet d’éviter presque toutes les erreurs courantes avec
DateC’est un peu verbeux, mais c’est bien mieux que d’être réveillé à 3 heures du matin pour corriger un bug lié à l’heure d’été
Un ticket ouvert en 2012 a fini par déboucher sur une solution intégrée à la bibliothèque standard
La discussion associée est visible dans ce fil Google Groups
fromisoformatme paraît maintenant tellement contre-intuitifAvant, j’utilisais
ciso8601, mais depuis que c’est dans la bibliothèque standard, c’est beaucoup plus simple et plus fiableet c’est particulièrement impressionnant de savoir qu’il a en réalité tout implémenté seul en tant que bénévole
Comme je partage du code entre client et serveur, j’essaie de séparer strictement les données de la logique
Je veux garder toutes les données en JSON pur pour faciliter la sérialisation/désérialisation, mais les objets Temporal sont des instances de classes avec des propriétés de fonction, ce qui est peu pratique
Je préfère une approche à la
date-fns, où des fonctions pures s’appliquent à des objets uniquement dédiés aux donnéesJSON.parseLe développeur doit reconstruire lui-même l’objet approprié à partir de la chaîne ISO
Automatiser cela ferait courir le risque de manipuler le mauvais type
L’exemple de reviver Temporal.Instant dans la documentation peut être utile
JSON.parse/stringifyfasse disparaître le prototype est un souci classiqueMais je pense que l’équipe Temporal a fait le bon choix. Pour la logique date/heure, la sûreté de typage est plus importante qu’une simple approche données + fonctions
Lier les opérations aux objets permet d’éviter qu’un
PlainDatesoit traité par erreur comme unZonedDateTimeAvec quelque chose comme tRPC, il suffit d’ajouter une fine couche qui convertit avec
Temporal.from()ettoString()aux frontièresC’est un peu fastidieux, mais c’est préférable à abandonner la sûreté de typage
Datede JavaScript ont exactement le même problèmeDate.toJSONexiste, mais lors du parsing JSON, il faut reconvertir la chaîne enDateTemporal fonctionne pareil, et
date-fnsmanipule au final lui aussi des instancesDatenatives.toString()etTemporal.from()JSON.parsepour qu’il crée automatiquement des objets Temporal serait excessifComme pour
Dateil est normal de le gérer explicitement de cette manièreFélicitations à tous les champions qui ont travaillé dessus pendant si longtemps
J’ai pris beaucoup de plaisir à travailler sur
temporal_rsces dernières annéesComme la proposition radicale de JavaScript est arrivée en 2018, je me demande dans quelle mesure l’approche de Java a pu influencer le résultat
TC39 s’est appuyé sur les précédents d’autres langages, tout en trouvant un consensus adapté à JavaScript
Je pense que cette API est l’implémentation la plus aboutie conçue par des experts JS au cours de ces 9 années
DateOn peut voir des détails à ce sujet dans ce fil HN
Datede Java » est amusanteparce que
util.Datede Java était lui-même presque un port de l’APItime.hdu COn dirait que Safari est devenu le successeur spirituel d’IE
Le problème d’IE n’était pas la lenteur, mais le fait de s’être arrêté depuis une position dominante
Aujourd’hui, c’est Chrome qui occupe la place de l’empire, et Safari comme Firefox sont au contraire plus nécessaires que jamais
Le vrai problème, c’est la multiplication des sites réservés à Chrome
DurationVoir la documentation MDNDuration