Stack Signal.
Technical news & guides across AI, programming and the open-source world
SATURDAY, NOVEMBER 14, 2026 · 108 articles · RSS

Programming & Web DevNov 14, 2026616 words

Node.js 26 Ships the Temporal API by Default

Node.js 26 ships the Temporal API by default — JavaScript's long-awaited date/time API is finally here

For as long as most of us have written JavaScript, this has been the drill: reach for Date, then spend twenty minutes fighting it. There was always the timezone confusion — getFullYear() returns local time, getUTCFullYear() returns UTC, and nobody remembers which one just bit them. Mutating methods like setHours() changed the object in place, so "add a day" meant juggling copies to keep snapshots intact. And arithmetic was mostly prayers: getTime() plus milliseconds, off-by-one months, no real calendar, no durations, no Gregorian-replacing anything. For two decades, that was the price of doing time in JavaScript. No longer.

Node.js 26, released in May 2026 and now on stable patch 26.11.0, enables the Temporal API by default. Contributed by Richard Lau (PR #61806), Temporal is the TC39 proposal that has been the JavaScript community's great white whale for years — and after a long run at Stage 3, it's finally part of the runtime you're probably already running.

What Temporal actually gives you

Temporal is a top-level namespace, like Math, and it replaces the single, overloaded Date object with a set of purpose-built, immutable, time-zone-aware (and calendar-aware!) types: Instant, PlainDate, PlainTime, ZonedDateTime, and Duration. "Immutable" is the quiet superpower here — every operation returns a new value, so you stop shipping subtle bugs where one function mutated the timestamp another function was still holding.

The types are also honest about what they're describing. A plain date with no timezone is a PlainDate — which means an end to the eternal "is this a wall clock in Hong Kong or a UTC instant?" guessing game:

const showingUpForCake = Temporal.PlainDate.from({ year: 2026, month: 8, day: 5 });
// "August 5" — no timezone involved, no ambiguity

Need "right now, with this user's offset"? That's the ZonedDateTime, and it's one call away:

const now = Temporal.Now.zonedDateTimeISO();

And arithmetic, which used to be a minefield of setHours() and getTime() gymnastics, is now explicit. Want a meeting that's 90 minutes long, or a subscription that renews in thirty days?

const meetingEnd = meetingStart.add({ minutes: 90 });
const renews = subscribedOn.add({ days: 30 });

Durations are first-class citizens. Duration arithmetic composes cleanly, and it behaves correctly across the edge cases that used to be your test-suite nightmares — daylight-saving transitions, month lengths, leap days. This isn't a cosmetic redesign; it's a different category of tool.

Not just Node

Node isn't shipping Temporal in a vacuum. Google Chrome 144, the first stable browser to include it, landed the API earlier this year, so client-side code can use the same types your server uses. The two runtimes speak the same date language now — no more authoring a Duration on the backend and reconstructing it by hand in the browser.

What else came with Node 26

Temporal is the headline, but Node 26 is a genuinely modern platform underneath it: V8 14.6 (Chromium 146), the Undici 8 HTTP stack, and the long-requested Map "upsert" methods — getOrInsert() and getOrInsertComputed() — plus Iterator.concat(). It also sweeps out legacy cruft: http.Server.prototype.writeHeader(), the old _stream_* internals, and --experimental-transform-types are gone, keeping the platform lean as it grows.

The practical read

You don't need to rewrite anything today. Temporal exists alongside Date, so existing code keeps working. What's changed is the floor: when you next touch date logic, new Date() is no longer the only option. Twenty years of setHours() hacks and UTC-or-local coin flips are now a documented trade you don't have to accept. The modern date/time API isn't coming — it's here, and it ships by default in Node.js 26.