Intead ofnew Date()
you'll increasingly see
Temporal.Now.instant()
For nearly three decades, JavaScript developers have lived with the Date object—an API that feels more like a historical accident than a deliberate design. Months start at zero. Parsing is inconsistent across engines. Time zone handling is error-prone. Arithmetic with dates frequently produces surprising results, especially around daylight saving transitions. Libraries like Moment.js, date-fns, Luxon, and Day.js sprang up precisely because the built-in primitive was so unreliable. Now that era is ending.
Temporal, the long-awaited replacement for Date, has reached Stage 4 in the TC39 process and is part of ECMAScript 2026. Native implementations are shipping. Node.js 26 turns Temporal on by default. Deno stabilized the API in version 2.7, removing the need for any unstable flag. Chrome 144, recent Firefox releases, and Edge already expose it. TypeScript has added type definitions. The polyfill remains available for older environments, but the writing is on the wall: Temporal is becoming the standard way to work with dates and times in JavaScript.
Why Temporal exists
The core problem with Date is that it tries to be too many things at once. A single mutable object represents both an absolute instant in time and a calendar date in some local time zone. This conflation produces an entire class of bugs. Calling setMonth or adding days can shift the hour when a DST transition is crossed. Serializing and deserializing often loses information or introduces subtle offsets. Comparing two dates that look the same on a wall clock but sit in different zones is fraught.
Temporal separates these concerns into distinct types:
Temporal.Instant— a precise point on the timeline (nanosecond resolution, always UTC under the hood).Temporal.PlainDate,Temporal.PlainTime,Temporal.PlainDateTime— calendar and clock values without any time-zone attachment.Temporal.ZonedDateTime— a calendar date and time anchored to a specific IANA time zone, with full DST awareness.Temporal.Duration— an amount of time that can be added or subtracted safely.Temporal.Now— a convenience namespace for obtaining the current instant, date, or zoned time.
Because the types are immutable, operations return new values rather than mutating in place. Because the API is designed around explicit calendars and time zones, the common foot-guns largely disappear. Adding one month to January 31 yields a sensible result instead of silently rolling into March. Converting between zones no longer requires manual offset arithmetic that is easy to get wrong.
Adoption across runtimes
Node.js was not the first to ship Temporal, but its default enablement in version 26 is a major signal. Server-side code that previously reached for a third-party library can now use the platform primitive. Deno moved even earlier, exposing Temporal behind a flag and then stabilizing it once browser engines made the same commitment. Bun has been tracking the same V8 and JavaScriptCore changes. The result is that the three major non-browser JavaScript runtimes now treat Temporal as a first-class citizen.
Browser support is following the usual staggered pattern, yet the coverage is already useful. Chrome and Edge have full implementations. Firefox has had mature support for some time. Safari’s Technology Preview continues to close the gap. For applications that must support older browsers, the official @js-temporal/polyfill (or the lighter temporal-polyfill) provides a drop-in path that matches the final specification closely enough for most production use.
Frameworks and libraries are reacting. Date-heavy packages are adding Temporal-native code paths. UI component libraries that previously wrapped Date or Moment are exposing Temporal-friendly props. Backend frameworks that generate timestamps or schedule work are updating their defaults. The migration is not instantaneous—legacy codebases will keep Date around for years—but new code is increasingly written against Temporal from day one.
What everyday code looks like
The most common replacement is obtaining the current moment:
// Old
const now = new Date();
// New
const now = Temporal.Now.instant();
Working with calendar dates becomes clearer:
const today = Temporal.Now.plainDateISO();
const nextWeek = today.add({ days: 7 });
const firstOfNextMonth = today.with({ day: 1 }).add({ months: 1 });
Time-zone-aware arithmetic, previously a source of subtle bugs, is now straightforward:
const meeting = Temporal.ZonedDateTime.from({
year: 2026,
month: 7,
day: 26,
hour: 14,
minute: 0,
timeZone: "America/New_York"
});
const inTokyo = meeting.withTimeZone("Asia/Tokyo");
const duration = meeting.until(inTokyo); // correctly accounts for the offset difference
Formatting still leans on Intl, which has been updated to understand Temporal objects, so localization remains familiar. Parsing is stricter and more predictable; ISO 8601 strings and the richer Temporal string formats are preferred over the loose Date constructor parsing that varied by engine.
Migration reality
No one expects a big-bang rewrite. Most teams will adopt Temporal incrementally. New modules and services can use it immediately. Boundary layers convert between Date and Temporal.Instant (via toTemporalInstant() and epoch-millisecond constructors) until the surrounding code is ready. Test suites that previously mocked Date now mock Temporal.Now or inject fixed Instant values. The polyfill makes it possible to write Temporal code today and drop the dependency later when the minimum supported runtime versions rise.
There are still edge cases. Non-Gregorian calendars, complex recurring schedules, and extremely high-precision scientific use cases may continue to need specialized libraries. But for the vast majority of web and server applications—scheduling, logging, user-facing dates, analytics timestamps—Temporal is sufficient and superior.
The broader shift
The arrival of Temporal is part of a larger maturation of the JavaScript platform. Just as Array, Map, Promise, and the module system moved from library territory into the language, date and time handling is finally receiving a proper standard. The nine-year journey from early proposals through Stage 3 implementations and finally Stage 4 reflects how carefully the committee approached a problem that touches every application.
Developers who once reflexively installed a date library for any non-trivial work can now reach for the language itself. Tutorials, blog posts, and conference talks are already shifting their examples. Job descriptions that list “experience with modern JavaScript date APIs” will soon mean Temporal rather than Moment or Luxon. The ecosystem friction that once made reliable time handling feel like an advanced topic is disappearing.
In short, new Date() is not going to vanish overnight, but its days as the default are numbered. Across Node, Deno, browsers, and the frameworks built on top of them, Temporal is becoming the standard. The code you write next month or next quarter is more likely than ever to start with Temporal.Now rather than the old constructor. That is a quiet but profound improvement for an entire generation of JavaScript applications.

