Breaking changes:
Temporal.ZonedDateTime
objects are no longer supported as parameters toIntl.DateTimeFormat
formatting methods. (12071fb0, see also Upstream PR, Upstream PR 2)- To format using
Temporal.ZonedDateTime
's time zone, useTemporal.ZonedDateTime.prototype.toLocaleString
. This method:- Creates a new
Intl.DateTimeFormat
instance in the same time zone and calendar as theTemporal.ZonedDateTime
instance - Creates a
Temporal.Instant
from theTemporal.ZonedDateTime
instance. - Formats that
Temporal.Instant
instance using the createdIntl.DateTimeFormat
instance.
- Creates a new
- To format in a time zone that does not match the time zone of the
Temporal.ZonedDateTime
instance:- Create a new
Temporal.ZonedDateTime
instance in the right time zone usingTemporal.ZonedDateTime.prototype.withTimeZone
.- To get the current system time zone, use
Temporal.Now.timeZoneId()
. Be careful when caching the current system time zone (or anIntl.DateTimeFormat
instance using that time zone), because the system time zone can change during the lifetime of your program (e.g. when a user on a mobile device crosses a time zone boundary or when a user manually edits time zone settings).
- To get the current system time zone, use
- Follow the steps above.
- Create a new
- Generally, try to always include the
timeZone
property when creating anIntl.DateTimeFormat
instance to avoid an ambiguity about which time zone the formatted results will be in. Intl.DateTimeFormat
instances can be expensive to create. For performance-sensitive code where the same calendar and time zone are used repeatedly for formatting, we recommend creating and reusing anIntl.DateTimeFormat
instance with the desiredtimeZone
andcalendar
options, and then formatting using the value ofTemporal.ZonedDateTime.prototype.epochMilliseconds
.Intl.DateTimeFormat
instances may also require a lot of RAM, so indefinitely caching large numbers of them is not recommended for memory-constrained environments.
- To format using
- The
.calendar
property on Temporal types has been replaced with a.calendarId
property that returns the string calendar identifier and a.getCalendar()
method that returns an object that implementsTemporal.CalendarProtocol
.getCalendar()
will always return a new object if the containing instance was constructed using a built-in calendar identifier string. However, if the containing instance was constructed using a calendar object (either a built-in calendar or custom calendar), then the same object is returned. (cc701b45, see also Upstream issue)- Temporal will compare calendars by testing for string equality between calendar identifiers.
When a calendar is an object, its
id
property will be used for comparison. (3916e547, see also Upstream issue) - The
.calendar
property has been entirely removed fromTemporal.PlainTime
. (0727d86e, see also Issue 1, Issue 2)
- The
.timeZone
property onTemporal.ZonedDateTime
has been replaced with a.timeZoneId
property that returns the string time zone identifier and a.getTimeZone()
method that returns an object that implementsTemporal.TimeZoneProtocol
. ([d3263f0], see also Upstream issue)getTimeZone()
will always return a new object if theTemporal.ZonedDateTime
instance was constructed using a built-in time zone identifier string. However, if the instance was constructed using a time zone object (either a built-in time zone or custom time zone), then the same object is returned.Termporal.Now.timeZone()
is replaced byTemporal.Now.timeZoneId()
, which returns a time zone identifier string, not aTemporal.TimeZone
instance. (600f0cc7, see also Upstream issue)- Temporal will compare time zones by testing for string equality between calendar identifiers.
When a calendar is an object, its
id
property will be used for comparison. (d6cb2862, see also Upstream issue)
- Require the
id
property and make overridingtoString
optional (but recommended!) forTemporal.TimeZoneProtocol
. (97637bbc) - Remove support for nested time zone and calendar property bags. (9b7f61ae, 0c38267b, see also Discussion)
- Require the remainder returned by the
NanosecondsToDays
internal operation to be less than the length of one calendar day. This could happen due to shenanigans in a custom time zone'sgetOffsetNanosecondsFor
orgetPossibleInstantsFor
methods, or a custom calendar'sdateAdd
method. (44b00a38, see also Upstream issue - Set an upper limit of 1e9 on rounding increments. (5d78c815)
- Require
fields
andmergeFields
methods forTemporal.CalendarProtocol
(custom calendar) objects. (5ad63274) - Reject Z designators when parsing
Temporal.PlainTime
strings.
Bug fixes:
- Read field identifiers from a calendar's
fields()
method duringdateFromFields()
,yearMonthFromFields()
, andmonthDayFromFields()
. Previously, these methods only referenced hardcoded'era'
and'eraYear'
field identifiers. (375a4ad9) - Avoid precision loss in AddDuration operations. (c0f7349a)
- Fix an infinite-loop bug and a RangeError during non-ISO calendar calculations. (d94c1cd9, see also proposal-temporal PR, Issue 1, Issue 2)
- Avoid rounding errors in
BalanceTime
operations. (9260a8a0) - Avoid precision loss in
NanosecondsToDays
operations. (e02f0626) - Require that results from
NanosecondsToDays
calls don't flip sign. (0b238ccf) - Fix bugs introduced while restricting the creation of
Temporal.Duration
using non-numeric inputs. (46c4132d, see also Upstream issue) - Fix bugs when passing fractional numbers to
CreateTemporalDuration
. (856a5460, see also Upstream issue) - Always return a Number of nanoseconds from
RoundDuration
. (8d3c1f1b) - Use BigInt math in
RoundDuration
to avoid problems when the values are larger thanNumber.MAX_SAFE_INTEGER
. (955323f8) - Always start at the end of 1972 when computing a
Temporal.PlainMonthDay
from fields, preventing the reference year from accidentally being in 1971. (ef4a0c4b) - Apply the overflow behaviour to year/month/day values in
monthDayFromFields
. (7ebd0f96) - Preserve the day of month when constraining a nonexistent leap month, instead of defaulting to the end of the closest corresponding regular month. (996f8fa1)
- Allow month codes
'M01L'
and'M12L'
in the Chinese calendar. (696f2c7e) - Avoid overflows in
GetNamedTimeZoneOffsetNanoseconds
. (c42570b8) - Fix calendar validation in various ToTemporal___ operations. (e3913974, see also Upstream issue)
- Don't call
GetMethod
on a string calendar. (fe698d8d, see also Upstream issue) - Avoid rounding errors in
BalanceDurationRelative
andUnbalanceDurationRelative
. (a907acf0) - Check for negative day length in
Temporal.ZonedDateTime.prototype.round
. (0d2d60ec, see also Spec PR) This change avoids a common bug where a UTC timestamp is accidentally interpreted as if it were a local time in a real time zone. If you do want to parse the time portion of a UTC timestamp string, use:Temporal.Instant.from(s).toZonedDateTimeISO('UTC').toPlainTime()
. (a7a50eac) - Reject 0-value components when parsing
Temporal.Duration
strings, and avoid rounding errors when nanoseconds components are present. (58b5601a) - Reject
relativeTo
string options that are neither validTemporal.PlainDate
norTemporal.ZonedDateTime
strings, such as'2022-08-18T17:01Z'
. (4db15c41) - Add validation for the return values from calendar operations. (d88cfa4d)
- Validate required methods of
Temporal.TimeZoneProtocol
andTemporal.CalendarProtocol
. (84563cea, 755c7620, see also Discussion) - Throw earlier when users might mix up positional
Temporal.TimeZone
andTemporal.Calendar
arguments with each other, to prevent bugs likenew Temporal.ZonedDateTime(0n, cal, tz)
where the switched calendar and time zone arguments would cause exceptions to be thrown later. (7922f1f9)
Non-breaking changes:
- Implement
yearOfWeek
methods that complement existingweekOfYear
methods. The new method returns the year associated withweekOfYear
, which may (see https://en.wikipedia.org/wiki/ISO_week_date) vary fromyear
in some calendars like'iso8601'
. This new method can be useful for formatting IS0 8601 strings using the year-week-day format like1981-W53-7
. (bf08ca56) - Support new Internet Extended Date-Time (IXDTF) Annotations
- See the Temporal + IXDTF tracking issue.
- Align ISO 8601 grammar with annotations from IXDTF specification.
Calendar and time zone annotations are now allowed to contain a "critical" flag (
'!'
) prefix. Critical flags have no effect when parsing input strings because Temporal already treats unknown or inconsistent inputs as errors by default. (e8b2e71c)- There can be multiple types of annotations in an IXDTF string. Temporal only recognizes time zone and calendar annotations. Unrecognized non-critical annotations will be ignored. Unrecognized critical annotations will cause the parsing method to throw an exception.
- Allow
toString()
methods forTemporal.PlainDate
,Temporal.PlainDateTime
,Temporal.PlainYearMonth
,Temporal.PlainMonthDay
, andTemporal.ZonedDateTime
to emit critical IXDTF annotations using the'critical'
option. Use this option with care, because the platform that you're communicating with may not understand this syntax.calendarName: 'critical'
behaves likecalendarName: 'always'
andtimeZoneName: 'critical'
behaves liketimeZoneName: 'always'
, but they also output a'!'
prefix in the corresponding annotation. (50a64f16) Critical flags are never used by Temporal, but could be consumed by other programs. - Ignore calendar annotations when parsing
Temporal.Instant
strings. (b86b87f0) - Allow calendar and/or time zone annotations after strings without a time part: YYYY-MM-DD, YYYY-MM, and MM-DD. (acd6464f)
- Disallow UTC offsets in YYYY-MM and MM-DD strings because they could cause ambiguity between an offset and the day of a YYYY-MM-DD string. (acd6464f)
- Reject ambiguous time strings even with calendar annotations. (af875275)
- Implement the full set of rounding modes.
New modes include
'expand'
,'halfCeil'
,'halfFloor'
,'halfTrunc'
, and'halfEven'
. (eb5404d1) - Treat calendar names as case-insensitive. (9e730d68)
- Improve cross-binary compatibility of polyfill objects by storing internals on
globalThis
. (73a0bf36, see also GitHub Issue) - Allow various
Temporal.Calendar
methods to return 0. (8a49023b) - Improve error messages when converting fields to a
Temporal.PlainMonthDay
. (e1cd4170) - Round towards the Big Bang in epoch time getters. (6d124a56, see also Upstream issue, Spec change)
- Improve performance when operating on large numbers in
BalanceISODate
. (d2a23dd5) - Optimize
Temporal.TimeZone.prototype.getNextTransition()
for dates that predate 1847, which is the earliest data in the IANA time zone database. (9591af3b) - Improve performance when out-of-range finding transition points for named time zones. (3b61abfe)
- Special-case zones with precomputed DST transition points in
GetPreviousTransition
. (5922bdf1)
Other:
- Bump required dependency versions. (c65455a5)
- Fix sourcemaps so they point directly to TS source files. (6b462d49, see also GitHub PR)
Bug fixes:
- Fix an off-by-one error when dates in the Hebrew calendar were created using
monthCode
, the year was a leap year, and the month was after the leap month (f3d0ca9f) - Fix addition of months and years for lunisolar calendars (4f8b04c1)
- Fix the ISO8601 representation of years between 1 BCE and 999 BCE (b251dc0e).
- Fix a bug causing time to appear to go backwards for a small number of milliseconds (bb59ca97)
- Always validate ISO8601 time components as well as date components (34662a05)
- Fix comparison of dates that might have a differing number of hours in their respective days (a4c60241)
- Include calendar reference information when
calendarName='always'
is passed to various Temporal toString method's options bags (54fcc4f3) - Fix a nonconformant use of the
relativeTo
property bag (9992f9b1) - Fix ZonedDateTime.prototype.withPlainTime(null) to throw a TypeError, instead of treating it as midnight (ec2b0546)
- Fix parsing of some valid Instant strings when they would be out of range before considering the UTC offset (d9de9e74)
- Bail out early in non-ISO calendar implementations to avoid an infinte loop when calculating the duration between two identical dates. (6f3c42c9)
- Fix type resolution when using TypeScript Node16 and transpiling to CJS (9bab0eb5, see also the relevant TypeScript issue)
Non-breaking changes:
- Consistently call observable operations with undefined options arguments, instead of empty objects (297b8f38)
This version is a patch version enabling TypeScript Node16 support for this package.
Bug Fixes:
- Add types to exports/./import to support Typescript Node16 (304c86dd)
This version is a patch version enabling polyfill compatibility with Safari versions <15.1 (October 2021 and earlier).
Bug fixes:
- Remove erroneous options from Safari's Intl.DateTimeFormat resolvedOptions bag. The underlying bug in Safari was fixed in Safari 15.1.
This version roughly corresponds with all the changes made to the Temporal polyfill as of the January 2022 TC39 Plenary meeting.
Breaking changes:
- Use JSBI instead of big-integer for Big Integer math operations. If your codebase does not need to polyfill BigInt, consider using the JSBI Babel plugin to transpile these operations to native BigInt.
- Reject plain date-only strings (b733c213, see also Spec PR, proposal-temporal polyfill PR)
- Reject '-000000' as an extended year value (670cda6b, see also Spec PR)
- Add missing branding checks for Calendar and Timezone classes to match spec changes (670cda6b, see also Spec PR)
Bug fixes:
- Temporal class prototypes are no longer writeable (871d28dc, see also proposal-temporal polyfill PR)
- Throw a RangeError for invalid offset strings (d5ada8b0, see also proposal-temporal polyfill PR)
- Pad fractional second values correctly in Duration.prototype.toString() (e046ccdf, see also Spec PR)
- Support the numberless output of Hebrew months from Intl.DateTimeFormat (b06ac47f, see also proposal-temporal polyfill PR)
- Workaround FireFox bug with Gregory era names (30c4d4d8, see also proposal-temporal polyfill PR)
Non-breaking changes:
- Rename public ...FromFields types (3554d7f1)
- Add validation for hard-coded Era data in Calendar.ts (08e84c9f)
- Improve code in Calendar.ts to handle calendar with a constant era but a variable number of months in a year (ef8c588b)
- Add an optional calendar to PlainTime, PlainDateTime, and PlainMonthDay (f8837367, see also Spec PR)
- Only require a year in Gregorian calendar implementations, not a full date (02aec1c3)
- Include
valueOf
in the Temporal.Duration type (b1dd7eb3) - Expand the types allowed to be used as TimezoneLike and CalendarLike to match the spec (9d54c646)
- Improve worse-case performance when finding Timezone transition points by over 1000X! (e70d6324)
- Change Calendar.fields to return an
Array
, not anIterable
(3145c6c4, see also Spec PR)
Other:
This version roughly corresponds with all the changes made to the Temporal polyfill as of the October 2021 TC39 Plenary meeting.
Breaking changes:
- Timezones now require a
getOffsetNanosecondsFor
method, and no longer fall back to the intrinsic definition (previously provided byTemporal.Timezone#getOffsetNanosecondsFor
) if not provided. (08346dc5, see also proposal-temporal polyfill PR) - Disallow Z designators when parsing strings for Plain Temporal types (f3f8a994, see also Spec PR)
- Allow ISO strings with "Z" + a bracketed IANA name (70bd9898, see also Spec PR)
- Emit ES2020 builds for newer browsers, and emit ES5 for older browsers. (2331468d, 9e95c62b)
- Temporal.Duration constructor will now throw if given a non-integer (9df5d068, see also Spec PR)
- Remove support for sub-minute offsets in ISO strings (766e5037, see also Spec PR, Spec PR)
- Throw TypeError on missing options from Duration.total (4ec075f0, see also Spec PR)
- Reject non-integer Duration fields in Duration.with() (e6b2488d, see also Spec PR)
- Ensure an Object is returned from calendar.mergeFields() (4e63f25f, see also Spec PR)
Bug fixes:
- Fix GetFormatterParts for Firefox Nightly (47f9132f)
- Fix TS types of RoundTo and TotalOf (3008a670)
- Fix crash setting
day
outside current JPN era (6d3588c3, see also proposal-temporal polyfill PR) - Copy options object for PlainYearMonth.{add,subtract} and InterpretTemporalDateTimeFields to prevent user-modified objects from interfering with later operations. (bafa1bdf, see also Spec PR)
- Validate input to Calendar.prototype.fields (7ebc700e, see also Spec PR)
- Stop observably calling into
getPossibleInstantsFor
inInterpretISODateTimeOffset
(5448e59f, see also Spec PR) - Call
CalendarEquals
correctly (07ea694e, see also proposal-temporal polyfill PR) - Fix arithmetic issues when using non-ISO months (079a3325, see also proposal-temporal polyfill PR)
- Regex: tighten matching of month and day values in datesplit (b5736546, see also proposal-temporal polyfill PR)
- Fix TS types for required CalendarProtocol methods (0ee4581f, see also proposal-temporal polyfill PR)
Non-breaking changes:
- Various
#round
and#total
methods now accept string parameters or options bags. Strings are interpreted as thesmallestUnit
option (orunit
forTemporal.Duration#total
). (068e801f, see also Spec PR) - Add @@toStringTag to TS types (41ab6bc0)
- Accept string Calendar names in PlainMonthDay and PlainYearMonth constructors (27b4c7e8)
- Make options optional in Calendar method TS types (3a09d00d)
- Align implementation of RoundDuration with adjusted spec text (4a0d0264, see also Spec PR)
Other:
- Bump various dependencies (47701107, f5427de9, 310d9d8b)
- Allow launching and debugging tests (both Demitasse and Test262 suites) from the VSCode debug panel (960d9b76, 7f7c19a1, 4ec6568e, edcc668b)
- Run the Test262 test suite against this polyfill, for various configurations of the resulting build artifact (2331468d, 666c69da, 429273ec, ff937782, f885253f)
- Remove various pieces of unused code, and add CI testing to detect unused code in PR review (67f9f6bb, 63bdfcd1)
- Drop the dependency on es-abstract (d24575f2, ad7e2e3a, 5b1bc5e2)
- The polyfill's source was ported to TypeScript (12e4d529, ac78fd9d, 53f32e0f, 06b806c9, 66fdc765, 50b1c34b, 4724b017, 947a8a5e, fdbf7e01, fa60af6a, da753f2f, f4db8b0b, 4a38420d)
- Document the release process for this polyfill (c55818b6)