Skip to content

Native Temporal and GMT

GMT is built on @js-temporal/polyfill, so it runs on a runtime that has no native Temporal. This page lists where Temporal is native and which GMT function matches each Temporal call.

Checked 2026-10-26, from the MDN browser compatibility data.

RuntimeFirst version with Temporal
Chrome and Edge144
Firefox139
Node.js26
Deno2.7
Bun1.4.0
Safari on macOSTechnology Preview only
Safari on iOSnot supported

TC39 moved Temporal to Stage 4 on 2026-03-11. It is not yet part of ECMA-262. On 2026-10-26 the pull request that adds it, ecma262 #3966, was open. An earlier pull request, #3759, was closed without merging. The text of the proposal is at tc39.es/proposal-temporal, and the clause numbers below refer to it.

TaskTemporalGMTSpecification
Today in a zoneTemporal.Now.plainDateISO(z).toString()getZonedToday2.2.5
Now in a zoneTemporal.Now.zonedDateTimeISO(z).toString()getZonedNow2.2.4
Now as UTCTemporal.Now.instant().toString()getUtcNow2.2.2
Add a monthPlainDate.from(s).add({ months: 1 }).toString()addDate3.3.21, 3.5.7
Add a calendar day in a zoneZonedDateTime.from(s).add({ days: 1 })addZoned6.3.35, 6.5.5
Differencea.until(b, { largestUnit: "months" })diffDate3.3.25, 12.3.9
Start of dayzdt.startOfDay()startOfZoned6.3.45, 11.1.14
Hours in a dayzdt.hoursInDaygetHoursInZonedDay6.3.23
Change zonezdt.withTimeZone(z)convertZonedToZoned6.3.33
UTC to zoneInstant.from(u).toZonedDateTimeISO(z)convertUtcToZoned8.3.15
Wall time to zonePlainDateTime.from(l).toZonedDateTime(z, { disambiguation })convertPlainDateTimeToZoned5.3.38, 11.1.11
Does the wall time existNo public method; the specification counts the candidate instantsclassifyLocal11.1.13
Next transitionzdt.getTimeZoneTransition("next")getDstTransitions6.3.46
Roundzdt.round({ smallestUnit: "hour" })roundZoned6.3.39
Equal valuesa.equals(b)areZonedEqual6.3.40
ISO weekd.yearOfWeek, d.weekOfYear, d.dayOfWeekgetIsoWeekDate3.3.12, 3.3.13, 12.3.18
Change calendard.withCalendar("japanese")convertDateToCalendar3.3.24
A year and a monthPlainYearMonth.from(s).toString()parseYearMonth, isValidYearMonth9.2.2
A month and a dayPlainMonthDay.from(s).toString()parseMonthDay, isValidMonthDay10.2.2
A month-day in a yearmd.toPlainDate({ year })monthDayToDate10.3.12
Duration totalDuration.from(s).total({ unit, relativeTo })totalDuration7.3.21
A Date objectdate.toTemporalInstant()toTemporalInstant14.9.1

The clause in each row is the rule GMT follows for that call.

GMT re-exports Temporal, Intl and toTemporalInstant from its root, taken from the polyfill. Code that needs a Temporal object and a GMT function can take both from @northguild/gmt.

import { Temporal, toTemporalInstant } from "@northguild/gmt";

For the results other libraries return on the same inputs, see Behaviour of date libraries against Temporal. Each library has its own page: date-fns, Luxon, Day.js, Moment.js and @internationalized/date.

Code examples: MIT-0. Packages: MIT. Third-party data and components: their own licences, credited where they appear. Everything else:© 2026 NorthGuild, all rights reserved.