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 nouveauDispo 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-30Takeaways 🎯
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