<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8" -->

---
title: Temporal: JavaScript Finally Fixes Dates | daily.dev
description: Temporal, the new JavaScript date/time API, shipped in Chrome 144 and reached TC39 Stage 4, making it a permanent part of the language rather than a library or...
canonical: https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Temporal: JavaScript Finally Fixes Dates | daily.dev
og:description: Temporal, the new JavaScript date/time API, shipped in Chrome 144 and reached TC39 Stage 4, making it a permanent part of the language rather than a library or...
og:url: https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8
og:image: https://api.daily.dev/og/posts/MDmvOkjs8.png
og:image:alt: Temporal: JavaScript Finally Fixes Dates
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.

# Temporal: JavaScript Finally Fixes Dates

**[iO tech\_hub](https://daily.dev/sources/iotechhub)** · 4 min read · 60 upvotes · 5 comments

## Summary

Temporal, the new JavaScript date/time API, shipped in Chrome 144 and reached TC39 Stage 4, making it a permanent part of the language rather than a library or polyfill. It fixes long-standing Date problems: immutability (methods return new values instead of mutating), separate purpose-built types (Instant, ZonedDateTime, PlainDate/PlainTime/PlainDateTime, Duration, Now) instead of one overloaded object, and correct timezone-aware arithmetic including daylight saving transitions. Browser support is uneven: Chrome/Edge since 144, Firefox since 139, but Safari only has it in Technology Preview, which is why it isn't yet Baseline. Polyfills (temporal-polyfill, @js-temporal/polyfill) are recommended for broad compatibility today, with the expectation that Temporal will replace libraries like date-fns within a year or two.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://techhub.iodigital.com/articles/temporal-javascript-finally-fixes-dates>

## Questions this post answers

### What is the Temporal API and how is it different from JavaScript's Date object?

Temporal is a new, official part of the JavaScript language, reaching TC39 Stage 4 in March and shipping in Chrome 144, that replaces the mutable, timezone-unaware Date object. Unlike Date, Temporal's methods like add() return new immutable values instead of mutating in place, and it splits time concepts into distinct types: Instant, ZonedDateTime, PlainDate, PlainTime, PlainDateTime, and Duration, each answering whether you mean a calendar date or a timezone-aware moment.

_Developers modernizing date handling in JavaScript can track Temporal's rollout progress on daily.dev._

### Which browsers support the JavaScript Temporal API?

Chrome and Edge have supported Temporal since version 144, and Firefox has supported it since version 139. Safari remains stuck at Technology Preview with active implementation work but no stable release yet, which is why Temporal is not classified as Baseline; the compatibility tracker has had it blocked on Safari since January. For broader compatibility today, use temporal-polyfill or the official @js-temporal/polyfill package.

_Teams deciding when to adopt Temporal in production can weigh browser support gaps discussed on daily.dev._

### How does Temporal fix the bug where JavaScript Date objects get mutated unexpectedly?

Temporal fixes this by making all its date and time types immutable, so calling a method like add() returns a brand-new value instead of changing the original in place. With the old Date object, calling something like setDate() on a date passed into a function would silently mutate the caller's original reference, a bug that often survives code review and surfaces later in production.

_Developers debugging shared-reference date bugs can compare Date and Temporal behavior via daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@pdfopsdev** · 5 upvotes

> biggest gotcha nobody mentions: Temporal objects don't have a built in toJSON like Date does, so anything serializing over an API boundary needs an explicit .toString() call or you get a weird object dump. worth checking before you rip out date-fns from anything hitting a wire format.

**@jntnlima** · 1 upvotes

> ![GIF](https://static.klipy.com/ii/c3a19a0b747a76e98651f2b9a3cca5ff/fd/83/dXeEGzLj.gif)

**@goodwine** · 0 upvotes

> Finalmente!

**@mikhailmakeev** · 0 upvotes

> Temporal fixes the type. It doesn't fix what the timestamp means, and that's where ours broke. Two ingest channels write the same column: for one it's when the aggregator first saw the article, for the other it's the publisher's own pubDate. Both are valid instants with correct offsets. Our p50 ingest lag read 66.3 minutes, which described nothing that ever happened to any article, because it was a blend of 30.5 minutes on one channel and 360.7 on the other, measured with two different clocks. We split the metric per channel instead of the column, since the column is faithful to each source....

**@agustinbarrientos** · 0 upvotes

> Library adapters should accept `Date` at the boundary and normalize it once until Safari ships native Temporal support

## Similar posts on daily.dev

- [The Temporal API: JavaScript dates, finally fixed](https://daily.dev/posts/the-temporal-api-javascript-dates-finally-fixed-kinwyu0tx) · Flavio Copes · 2 upvotes · 0 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
- [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
- [Date is out, Temporal is in](https://daily.dev/posts/date-is-out-temporal-is-in-rx3sgyn1u) · Piccalilli · 341 upvotes · 17 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), [#google-chrome](https://daily.dev/tags/google-chrome)

[View this post on daily.dev](https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8)

```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":"Temporal: JavaScript Finally Fixes Dates","url":"https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8"},"datePublished":"2026-08-31T12:45:55.918Z","dateModified":"2026-09-14T06:19:40.114Z","description":"Temporal, the new JavaScript date/time API, shipped in Chrome 144 and reached TC39 Stage 4, making it a permanent part of the language rather than a library or...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/7e8ce020df1577a06813d039e0ac8f74?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/7e8ce020df1577a06813d039e0ac8f74?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"iO tech_hub","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":"iO tech_hub","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/ac540f589d8843d99692bd6368ee7680","url":"https://daily.dev/sources/iotechhub"},"commentCount":5,"discussionUrl":"https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":60},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":5}],"keywords":"javascript,google-chrome","timeRequired":"PT4M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"iO tech_hub","item":"https://daily.dev/sources/iotechhub"},{"@type":"ListItem","position":3,"name":"Temporal: JavaScript Finally Fixes Dates"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8","comment":[{"@type":"Comment","text":"biggest gotcha nobody mentions: Temporal objects don’t have a built in toJSON like Date does, so anything serializing over an API boundary needs an explicit .toString() call or you get a weird object dump. worth checking before you rip out date-fns from anything hitting a wire format.","datePublished":"2026-09-01T18:04:27.128Z","url":"https://daily.dev/posts/MDmvOkjs8#c-n8EBuhLaL","author":{"@type":"Person","name":"PDFops","url":"https://daily.dev/pdfopsdev","image":"https://media.daily.dev/image/upload/s---8isRBKc--/f_auto/v1782922291/avatars/avatar_orjMeK8QKaaVZwGq7ScPz?_a=BAMAMicg0"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":5}},{"@type":"Comment","text":"","datePublished":"2026-09-07T01:11:46.381Z","url":"https://daily.dev/posts/MDmvOkjs8#c-9oGGH2aZY","author":{"@type":"Person","name":"Jonathan Lima","url":"https://daily.dev/jntnlima","image":"https://avatars.githubusercontent.com/u/67848049?v=4"},"interactionStatistic":{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1}},{"@type":"Comment","text":"Finalmente!","datePublished":"2026-09-01T20:58:33.960Z","url":"https://daily.dev/posts/MDmvOkjs8#c-Z43nTmx4F","author":{"@type":"Person","name":"Giuliano","url":"https://daily.dev/goodwine","image":"https://media.daily.dev/image/upload/s--a4_3G2w8--/f_auto/v1768794714/avatars/avatar_1zdQSUWX1pJufCW5uT6Uh?_a=BAMAMiiu0"}},{"@type":"Comment","text":"Temporal fixes the type. It doesn’t fix what the timestamp means, and that’s where ours broke. Two ingest channels write the same column: for one it’s when the aggregator first saw the article, for the other it’s the publisher’s own pubDate. Both are valid instants with correct offsets. Our p50 ingest lag read 66.3 minutes, which described nothing that ever happened to any article, because it was a blend of 30.5 minutes on one channel and 360.7 on the other, measured with two different clocks. We split the metric per channel instead of the column, since the column is faithful to each source. A zoned instant still doesn’t tell you which event it names.","datePublished":"2026-09-07T06:42:58.836Z","url":"https://daily.dev/posts/MDmvOkjs8#c-9ULwDJpYZ","author":{"@type":"Person","name":"Mikhail Makeev","url":"https://daily.dev/mikhailmakeev","image":"https://lh3.googleusercontent.com/a/ACg8ocIjcvDU1gmJ9-KJDeTYqY2rMdl5QxcWYtLTGSXrj8ubF4nwar_w=s96-c"}},{"@type":"Comment","text":"Library adapters should accept Date at the boundary and normalize it once until Safari ships native Temporal support","datePublished":"2026-09-01T23:52:24.305Z","url":"https://daily.dev/posts/MDmvOkjs8#c-hL4Wxe6z3","author":{"@type":"Person","name":"Agustin Barrientos","url":"https://daily.dev/agustinbarrientos","image":"https://media.daily.dev/image/upload/s--5ayxQnqn--/f_auto/v1788281802/avatars/avatar_wQYYVe5Tbj0NJ7C7qPoa8?_a=BAMAMicg0"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/temporal-javascript-finally-fixes-dates-mdmvokjs8#faq","mainEntity":[{"@type":"Question","name":"What is the Temporal API and how is it different from JavaScript's Date object?","acceptedAnswer":{"@type":"Answer","text":"Temporal is a new, official part of the JavaScript language, reaching TC39 Stage 4 in March and shipping in Chrome 144, that replaces the mutable, timezone-unaware Date object. Unlike Date, Temporal's methods like add() return new immutable values instead of mutating in place, and it splits time concepts into distinct types: Instant, ZonedDateTime, PlainDate, PlainTime, PlainDateTime, and Duration, each answering whether you mean a calendar date or a timezone-aware moment. Developers modernizing date handling in JavaScript can track Temporal's rollout progress on daily.dev."}},{"@type":"Question","name":"Which browsers support the JavaScript Temporal API?","acceptedAnswer":{"@type":"Answer","text":"Chrome and Edge have supported Temporal since version 144, and Firefox has supported it since version 139. Safari remains stuck at Technology Preview with active implementation work but no stable release yet, which is why Temporal is not classified as Baseline; the compatibility tracker has had it blocked on Safari since January. For broader compatibility today, use temporal-polyfill or the official @js-temporal/polyfill package. Teams deciding when to adopt Temporal in production can weigh browser support gaps discussed on daily.dev."}},{"@type":"Question","name":"How does Temporal fix the bug where JavaScript Date objects get mutated unexpectedly?","acceptedAnswer":{"@type":"Answer","text":"Temporal fixes this by making all its date and time types immutable, so calling a method like add() returns a brand-new value instead of changing the original in place. With the old Date object, calling something like setDate() on a date passed into a function would silently mutate the caller's original reference, a bug that often survives code review and surfaces later in production. Developers debugging shared-reference date bugs can compare Date and Temporal behavior via daily.dev."}}]}
```

