new Date() is broken 💔

new Date(2025, 0, 1)  // January ?!
new Date("2025-01-01") // UTC
new Date("01/01/2025") // Local
date.setMonth(1)       // mutates 😱

Le problème avec Date 🤦

• Mois 0-indexed (janvier = 0)

• Mutable (setMonth modifie l'objet)

• Pas de timezone fiable

• Parsing incohérent entre navigateurs

• Pas d'arithmétique native

• API pauvre (pas de .add, .diff...)

L'ère des librairies 📚

moment.js → date-fns → Day.js → Luxon


Comme jQuery corrigeait le DOM...

ces libs corrigent Date


Le langage doit évoluer,

pas les dépendances.

querySelector a tué jQuery 🔪

// Avant (jQuery)
$(".btn").on("click", handler)
$.ajax("/api")

// Après (natif)
document.querySelector(".btn")
fetch("/api")

Temporal va tuer moment 🔪

// Avant (moment.js)
moment().add(1, "day").format("YYYY-MM-DD")

// Après (Temporal)
Temporal.Now.plainDateISO()
  .add({ days: 1 })
  .toString()

D'où vient Temporal ? 🏛️

TC39 — le comité derrière ECMAScript


Porté par Igalia

Sponsorisé par Bloomberg


Stage 3 depuis 2021

8 ans de travail !

3 types de dates ⏰

Temporal.Instant

→ un point précis dans le temps (UTC)


Temporal.PlainDate

→ une date civile, sans timezone


Temporal.ZonedDateTime

→ date + heure + timezone

Temporal.Instant ⚡

// Un point précis dans le temps
const now = Temporal.Now.instant()
// → 2025-03-30T14:30:00.000Z

// Depuis un timestamp
Temporal.Instant.fromEpochMilliseconds(0)
// → 1970-01-01T00:00:00Z

// Comparer deux instants
Temporal.Instant.compare(a, b)

Temporal.PlainDate 📅

// Date civile — pas de timezone
const birthday = Temporal.PlainDate
  .from("2025-12-25")

// Arithmétique simple
birthday.add({ months: 1 })
// → 2026-01-25

// Aussi: PlainTime, PlainDateTime
Temporal.PlainTime.from("14:30")

Temporal.ZonedDateTime 🌍

// Date + heure + timezone
const meeting = Temporal.ZonedDateTime
  .from("2025-03-30T10:00[Europe/Paris]")

// Convertir en autre timezone
meeting.withTimeZone("America/New_York")
// → 2025-03-30T04:00-04:00[America/New_York]

// Plus de bugs de DST !

Immutable by design 🔒

// Date — MUTABLE 💀
const d = new Date(2025, 0, 1)
d.setMonth(5) // modifie d !

// Temporal — IMMUTABLE ✅
const t = Temporal.PlainDate.from("2025-01-01")
const t2 = t.add({ months: 5 })
// t est inchangé, t2 est nouveau

Dispo pour qui ? 🚀

🟢 Chrome / Edge 129+ (derrière flag)

🟡 Firefox — en cours

🟡 Safari — en cours


🟢 Node.js — --harmony-temporal

🟢 Deno — support natif


📦 Polyfill: @js-temporal/polyfill

Le polyfill 📦

npm install @js-temporal/polyfill

import { Temporal } from
  "@js-temporal/polyfill"

const now = Temporal.Now.plainDateISO()
console.log(now.toString())
// → 2025-03-30

Takeaways 🎯

1. Nouveau projet JS/Node ?

Oubliez moment, date-fns, dayjs, luxon

→ Go Temporal


2. 3 types de dates :

Instant · PlainDate · ZonedDateTime


3. Immutable by design

Fini les bugs silencieux de mutation

Ressources 🔗

Proposal: github.com/tc39/proposal-temporal


Docs: tc39.es/proposal-temporal/docs/


Polyfill: npmjs.com/package/@js-temporal/polyfill


Cookbook: tc39.es/proposal-temporal/docs/cookbook.html


Enjoy ! 🎉

Dates Revolution

By Patrice H.

Dates Revolution

  • 1