javascript

Temporal

Every JavaScript codebase has a date library in it somewhere. moment, date-fns, luxon, dayjs. Usually because Date sucks, and we needed a pile of workarounds for a 30-year-old mistake.

Temporal reached Stage 4 on March 13, 2026. That means it is part of ECMAScript now. 🎉

The problem with Date was never just formatting. It was the whole model. Mutable objects. Weird parsing. Local time vs UTC surprises. The bug in this example is the classic one: pass a Date into a helper, mutate it, and now "today" quietly became tomorrow.

Temporal fixes the shape of the problem. Values are immutable. A PlainDate is just a date. Add a day, get a new value back, move on. This write-up from Piccalilli covers the deeper API design if you want the full tour.

The real punchline is bundle cleanup. Go look at your dependency graph and ask how much of it exists just to survive Date. Temporal turns that whole category into platform code. One less import. Probably your heaviest one.

Support is real enough to act on. Firefox ships it. Chromium-based browsers are there. If your browser matrix still has gaps, ship @js-temporal/polyfill now and delete that too when you can.

Same starting day. One mutable API. One immutable one.

Old world

Date mutates the input

Call a setter in some helper and the original value is gone.

SeedMar 17, 2026
Tomorrowclick Run Date bug
Today afterMar 17, 2026
Same objectnot checked

This is why Date helpers become landmines.

New hotness

Temporal returns a new value

Same date math, no mutation, no reference trap, no surprise.

Seed2026-03-17
Tomorrowclick Run Temporal
Today after2026-03-17
Source changednot checked

This is the whole mood shift.

Dependency cleanup, eventually:

npm uninstall momentnpm uninstall date-fnsnpm uninstall luxonnpm uninstall dayjs