<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx" -->

---
title: The Temporal API: JavaScript dates, finally fixed
description: The JavaScript Temporal API is now at TC39 Stage 4 and shipping natively in Firefox 139+, Chrome 144+, Node.js 26+, and Deno. It replaces the long-broken Date...
canonical: https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: The Temporal API: JavaScript dates, finally fixed | daily.dev
og:description: The JavaScript Temporal API is now at TC39 Stage 4 and shipping natively in Firefox 139+, Chrome 144+, Node.js 26+, and Deno. It replaces the long-broken Date...
og:url: https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx
og:image: https://api.daily.dev/og/posts/kInWYU0TX.png
og:image:alt: The Temporal API: JavaScript dates, finally fixed
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# The Temporal API: JavaScript dates, finally fixed

**[Flavio Copes](https://daily.dev/sources/flaviocopes)** · 4 min read · 2 upvotes · 0 comments

## Summary

The JavaScript Temporal API is now at TC39 Stage 4 and shipping natively in Firefox 139+, Chrome 144+, Node.js 26+, and Deno. It replaces the long-broken Date object with immutable, explicit types: PlainDate, PlainTime, PlainDateTime, ZonedDateTime, Instant, and Duration. Key improvements include 1-indexed months, immutable operations, proper IANA time zone support, and consistent parsing. Practical examples cover adding days, computing differences, comparing dates, formatting, and converting time zones — all without external libraries. Safari support is pending, so polyfills (@js-temporal/polyfill or temporal-polyfill) are recommended for production use.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://flaviocopes.com/temporal-api>

## Questions this post answers

### What is the JavaScript Temporal API and how does it differ from the Date object?

Temporal is a new built-in JavaScript global that replaces the mutable, error-prone Date object with immutable, explicit types. Instead of one ambiguous Date type, Temporal splits time concepts into PlainDate, PlainTime, PlainDateTime, ZonedDateTime, Instant, and Duration, so every value clearly states what it represents. Every operation returns a new value rather than mutating in place, fixing a longstanding source of bugs.

_daily.dev surfaces API changes like this for developers migrating date logic off the legacy Date object._

### Which browsers and runtimes support the Temporal API natively?

As of mid-2026, Temporal ships natively in Firefox 139+, Chrome 144+, Node.js 26+, and Deno. Safari is the holdout, offering it only in Safari Technology Preview behind a flag, which blocks Baseline status. For production use today, a polyfill such as @js-temporal/polyfill or the smaller temporal-polyfill from FullCalendar is recommended until Safari ships stable support.

_Track browser support status like this on daily.dev before betting production code on a new API._

### How do I add days to a date without mutating the original in JavaScript using Temporal?

Call the add() method on a Temporal.PlainDate instance with an object like { days: 3 }, which returns a new PlainDate value while leaving the original untouched. For example, Temporal.Now.plainDateISO().add({ days: 3 }) produces a new date three days later without altering the original value, unlike the old Date object which could be mutated in place by any function that touched it.

_daily.dev helps developers compare old and new date-handling patterns when migrating date logic._

## Similar posts on daily.dev

- [Temporal: JavaScript Finally Fixes Dates](https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8) · iO tech\_hub · 60 upvotes · 5 comments
- [Chrome 144 Ships Temporal API: Advancing JavaScript Date/Time Standardisation](https://daily.dev/posts/chrome-144-ships-temporal-api-advancing-javascript-date-time-standardisation-cnojmzff6) · InfoQ · 1 upvotes · 0 comments
- [Date is out, Temporal is in](https://daily.dev/posts/date-is-out-temporal-is-in-rx3sgyn1u) · Piccalilli · 341 upvotes · 17 comments
- [Temporal: The 9-Year Journey to Fix Time in JavaScript](https://daily.dev/posts/temporal-the-9-year-journey-to-fix-time-in-javascript-ti2wilj4c) · Hacker News · 1 upvotes · 0 comments
- [TC39 Advances Temporal to Stage 4 Alongside Several ECMAScri...](https://daily.dev/posts/tc39-advances-temporal-to-stage-4-alongside-several-ecmascri--wsjtjdml5) · Socket · 26 upvotes · 3 comments

---

Tags: [#javascript](https://daily.dev/tags/javascript)

[View this post on daily.dev](https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"The Temporal API: JavaScript dates, finally fixed","url":"https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx"},"datePublished":"2026-08-01T06:43:57.762Z","dateModified":"2026-09-14T07:53:00.179Z","description":"The JavaScript Temporal API is now at TC39 Stage 4 and shipping natively in Firefox 139+, Chrome 144+, Node.js 26+, and Deno. It replaces the long-broken Date...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/92f4332f5ebf14def443e4b1f4369428?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/92f4332f5ebf14def443e4b1f4369428?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Flavio Copes","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Flavio Copes","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/1f2dbd275797411bbd37bfdaaf0951a9","url":"https://daily.dev/sources/flaviocopes"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":2},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"javascript","timeRequired":"PT4M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Flavio Copes","item":"https://daily.dev/sources/flaviocopes"},{"@type":"ListItem","position":3,"name":"The Temporal API: JavaScript dates, finally fixed"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx#faq","mainEntity":[{"@type":"Question","name":"What is the JavaScript Temporal API and how does it differ from the Date object?","acceptedAnswer":{"@type":"Answer","text":"Temporal is a new built-in JavaScript global that replaces the mutable, error-prone Date object with immutable, explicit types. Instead of one ambiguous Date type, Temporal splits time concepts into PlainDate, PlainTime, PlainDateTime, ZonedDateTime, Instant, and Duration, so every value clearly states what it represents. Every operation returns a new value rather than mutating in place, fixing a longstanding source of bugs. daily.dev surfaces API changes like this for developers migrating date logic off the legacy Date object."}},{"@type":"Question","name":"Which browsers and runtimes support the Temporal API natively?","acceptedAnswer":{"@type":"Answer","text":"As of mid-2026, Temporal ships natively in Firefox 139+, Chrome 144+, Node.js 26+, and Deno. Safari is the holdout, offering it only in Safari Technology Preview behind a flag, which blocks Baseline status. For production use today, a polyfill such as @js-temporal/polyfill or the smaller temporal-polyfill from FullCalendar is recommended until Safari ships stable support. Track browser support status like this on daily.dev before betting production code on a new API."}},{"@type":"Question","name":"How do I add days to a date without mutating the original in JavaScript using Temporal?","acceptedAnswer":{"@type":"Answer","text":"Call the add() method on a Temporal.PlainDate instance with an object like { days: 3 }, which returns a new PlainDate value while leaving the original untouched. For example, Temporal.Now.plainDateISO().add({ days: 3 }) produces a new date three days later without altering the original value, unlike the old Date object which could be mutated in place by any function that touched it. daily.dev helps developers compare old and new date-handling patterns when migrating date logic."}}]}
```

