@northguild/gmt 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +462 -22
- package/dist/calendar/calculate/bucketRange.d.ts +3 -3
- package/dist/calendar/calculate/bucketRange.js +6 -6
- package/dist/calendar/calculate/floorToZone.d.ts +5 -3
- package/dist/calendar/calculate/floorToZone.js +6 -5
- package/dist/calendar/calculate/getFiscalPeriod.d.ts +21 -8
- package/dist/calendar/calculate/getFiscalPeriod.js +9 -8
- package/dist/calendar/calculate/getIsoWeekDate.d.ts +10 -5
- package/dist/calendar/calculate/getIsoWeekDate.js +1 -5
- package/dist/calendar/calculate/getOrdinalDate.d.ts +10 -3
- package/dist/calendar/calculate/getOrdinalDate.js +2 -3
- package/dist/calendar/calculate/getQuarter.d.ts +21 -9
- package/dist/calendar/calculate/getQuarter.js +8 -12
- package/dist/calendar/hours/addOperatingTime.d.ts +53 -0
- package/dist/calendar/hours/addOperatingTime.js +59 -0
- package/dist/calendar/hours/index.d.ts +7 -0
- package/dist/calendar/hours/index.js +7 -0
- package/dist/calendar/hours/isOpenAt.d.ts +39 -0
- package/dist/calendar/hours/isOpenAt.js +44 -0
- package/dist/calendar/hours/nextCloseAt.d.ts +49 -0
- package/dist/calendar/hours/nextCloseAt.js +51 -0
- package/dist/calendar/hours/nextOpenAt.d.ts +45 -0
- package/dist/calendar/hours/nextOpenAt.js +47 -0
- package/dist/calendar/hours/operatingIntervals.d.ts +43 -0
- package/dist/calendar/hours/operatingIntervals.js +52 -0
- package/dist/calendar/hours/operatingTimeBetween.d.ts +40 -0
- package/dist/calendar/hours/operatingTimeBetween.js +49 -0
- package/dist/calendar/hours/recurringWindows.d.ts +61 -0
- package/dist/calendar/hours/recurringWindows.js +80 -0
- package/dist/calendar/index.d.ts +1 -0
- package/dist/calendar/index.js +1 -0
- package/dist/duration/calculate/durationAs.d.ts +13 -8
- package/dist/duration/calculate/durationAs.js +4 -8
- package/dist/duration/compare/compareDurations.d.ts +12 -6
- package/dist/duration/compare/compareDurations.js +3 -6
- package/dist/duration/format/formatDuration.d.ts +16 -4
- package/dist/duration/format/formatDuration.js +4 -5
- package/dist/duration/normalize/normalizeDuration.d.ts +39 -14
- package/dist/duration/normalize/normalizeDuration.js +6 -15
- package/dist/duration/parse/parseDuration.d.ts +21 -3
- package/dist/duration/parse/parseDuration.js +1 -3
- package/dist/instant/convert/classifyLocal.d.ts +1 -1
- package/dist/instant/convert/classifyLocal.js +1 -1
- package/dist/instant/convert/fromOffsetInstant.d.ts +3 -1
- package/dist/instant/convert/fromOffsetInstant.js +3 -1
- package/dist/instant/convert/resolveLocal.d.ts +12 -7
- package/dist/instant/convert/resolveLocal.js +6 -10
- package/dist/instant/convert/toOffsetInstant.d.ts +22 -9
- package/dist/instant/convert/toOffsetInstant.js +10 -3
- package/dist/intermodal/calculate/billingTimeline.d.ts +31 -11
- package/dist/intermodal/calculate/billingTimeline.js +2 -2
- package/dist/intermodal/calculate/chargeableDays.d.ts +13 -11
- package/dist/intermodal/calculate/chargeableDays.js +4 -9
- package/dist/intermodal/calculate/demurrageClock.d.ts +16 -7
- package/dist/intermodal/calculate/demurrageClock.js +7 -7
- package/dist/intermodal/calculate/freeTimeExpiry.d.ts +5 -4
- package/dist/intermodal/calculate/freeTimeExpiry.js +6 -6
- package/dist/internal/businessCalendar.d.ts +5 -0
- package/dist/internal/businessCalendar.js +5 -1
- package/dist/internal/cycleFieldValue.d.ts +6 -4
- package/dist/internal/cycleFieldValue.js +6 -4
- package/dist/internal/daylightTime.d.ts +33 -0
- package/dist/internal/daylightTime.js +164 -0
- package/dist/internal/durationUntilString.js +4 -3
- package/dist/internal/englishCalendarNames.js +1 -2
- package/dist/internal/epochNanoseconds.d.ts +2 -0
- package/dist/internal/epochNanoseconds.js +2 -0
- package/dist/internal/exactDuration.d.ts +37 -0
- package/dist/internal/exactDuration.js +64 -0
- package/dist/internal/exactMoment.d.ts +72 -0
- package/dist/internal/exactMoment.js +114 -0
- package/dist/internal/fiscalCalendar.d.ts +4 -3
- package/dist/internal/fiscalCalendar.js +4 -3
- package/dist/internal/formatCalendarDays.d.ts +2 -2
- package/dist/internal/formatRelativeDuration.d.ts +21 -1
- package/dist/internal/formatRelativeDuration.js +47 -7
- package/dist/internal/index.d.ts +9 -4
- package/dist/internal/index.js +9 -4
- package/dist/internal/instantFormatOptions.js +2 -1
- package/dist/internal/instantNanoseconds.d.ts +75 -9
- package/dist/internal/instantNanoseconds.js +192 -11
- package/dist/internal/joinDateTimeConnector.d.ts +1 -1
- package/dist/internal/monthGridWeekRow.d.ts +2 -1
- package/dist/internal/monthGridWeekRow.js +2 -1
- package/dist/internal/normalizeTimeZone.d.ts +2 -2
- package/dist/internal/normalizeTimeZone.js +2 -2
- package/dist/internal/operatingSchedule.d.ts +129 -0
- package/dist/internal/operatingSchedule.js +668 -0
- package/dist/internal/optionOrDefault.d.ts +18 -0
- package/dist/internal/optionOrDefault.js +20 -0
- package/dist/internal/patternToken.d.ts +2 -2
- package/dist/internal/patternToken.js +28 -13
- package/dist/internal/plainDateUntil.js +10 -6
- package/dist/internal/punctuality.d.ts +38 -0
- package/dist/internal/punctuality.js +59 -0
- package/dist/internal/readDateTimeFormatOptions.d.ts +30 -0
- package/dist/internal/readDateTimeFormatOptions.js +93 -0
- package/dist/internal/resolveDurationRelativeTo.d.ts +4 -0
- package/dist/internal/resolveDurationRelativeTo.js +11 -1
- package/dist/internal/resolveRelativeRounding.d.ts +17 -6
- package/dist/internal/resolveRelativeRounding.js +27 -7
- package/dist/internal/resolveRelativeUnit.d.ts +30 -0
- package/dist/internal/resolveRelativeUnit.js +40 -0
- package/dist/internal/splitStep.d.ts +24 -1
- package/dist/internal/splitStep.js +34 -2
- package/dist/internal/startOrEndOfZoned.js +2 -3
- package/dist/internal/temporalCompat/capabilities.d.ts +26 -0
- package/dist/internal/temporalCompat/capabilities.js +35 -3
- package/dist/internal/temporalCompat/fieldSearch.js +1 -1
- package/dist/internal/temporalCompat/index.d.ts +1 -1
- package/dist/internal/temporalCompat/index.js +1 -1
- package/dist/internal/temporalCompat/repros.d.ts +1 -1
- package/dist/internal/temporalCompat/repros.js +157 -0
- package/dist/internal/timestampEvents.d.ts +32 -0
- package/dist/internal/timestampEvents.js +76 -0
- package/dist/internal/utcZonedDateTime.d.ts +5 -2
- package/dist/internal/utcZonedDateTime.js +8 -5
- package/dist/internal/zonedBucket.js +8 -6
- package/dist/internal/zonedLocalDates.js +1 -1
- package/dist/internal/zonedTransitionSearch.d.ts +27 -0
- package/dist/internal/zonedTransitionSearch.js +218 -0
- package/dist/internal/zonedWallClock.d.ts +21 -7
- package/dist/internal/zonedWallClock.js +87 -18
- package/dist/internal/zonedWallClockOperations.d.ts +26 -13
- package/dist/internal/zonedWallClockOperations.js +87 -34
- package/dist/interval/validate/isValidInterval.d.ts +6 -3
- package/dist/interval/validate/isValidInterval.js +6 -3
- package/dist/plain/calculate/addDate.d.ts +11 -8
- package/dist/plain/calculate/addDate.js +5 -8
- package/dist/plain/calculate/addDateTime.d.ts +7 -4
- package/dist/plain/calculate/addDateTime.js +1 -4
- package/dist/plain/calculate/cycleDate.d.ts +16 -7
- package/dist/plain/calculate/cycleDate.js +3 -7
- package/dist/plain/calculate/cycleDateTime.d.ts +14 -4
- package/dist/plain/calculate/cycleDateTime.js +1 -4
- package/dist/plain/calculate/cycleTime.d.ts +10 -5
- package/dist/plain/calculate/cycleTime.js +3 -5
- package/dist/plain/calculate/diffDate.d.ts +1 -1
- package/dist/plain/calculate/diffDate.js +1 -1
- package/dist/plain/calculate/diffDateAsDuration.d.ts +1 -1
- package/dist/plain/calculate/diffDateAsDuration.js +1 -1
- package/dist/plain/calculate/diffDateTime.d.ts +1 -1
- package/dist/plain/calculate/diffDateTime.js +1 -1
- package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +1 -1
- package/dist/plain/calculate/diffDateTimeAsDuration.js +1 -1
- package/dist/plain/calculate/diffTime.d.ts +1 -1
- package/dist/plain/calculate/diffTime.js +1 -1
- package/dist/plain/calculate/endOfDate.d.ts +8 -3
- package/dist/plain/calculate/endOfDate.js +1 -3
- package/dist/plain/calculate/endOfDateTime.d.ts +15 -5
- package/dist/plain/calculate/endOfDateTime.js +1 -5
- package/dist/plain/calculate/endOfTime.d.ts +8 -2
- package/dist/plain/calculate/endOfTime.js +1 -2
- package/dist/plain/calculate/getLocaleWeekYear.d.ts +16 -9
- package/dist/plain/calculate/getLocaleWeekYear.js +9 -9
- package/dist/plain/calculate/getWeekOfMonth.d.ts +7 -4
- package/dist/plain/calculate/getWeekOfMonth.js +7 -4
- package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +13 -6
- package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +6 -6
- package/dist/plain/calculate/getWeeksInMonth.d.ts +5 -2
- package/dist/plain/calculate/getWeeksInMonth.js +5 -2
- package/dist/plain/calculate/nextWeekday.d.ts +7 -3
- package/dist/plain/calculate/nextWeekday.js +1 -3
- package/dist/plain/calculate/previousWeekday.d.ts +7 -3
- package/dist/plain/calculate/previousWeekday.js +1 -3
- package/dist/plain/calculate/roundDate.d.ts +20 -7
- package/dist/plain/calculate/roundDate.js +3 -10
- package/dist/plain/calculate/roundDateTime.d.ts +22 -8
- package/dist/plain/calculate/roundDateTime.js +3 -11
- package/dist/plain/calculate/roundTime.d.ts +20 -4
- package/dist/plain/calculate/roundTime.js +3 -7
- package/dist/plain/calculate/setDate.d.ts +7 -5
- package/dist/plain/calculate/setDate.js +1 -5
- package/dist/plain/calculate/setDateTime.d.ts +8 -5
- package/dist/plain/calculate/setDateTime.js +1 -5
- package/dist/plain/calculate/setTime.d.ts +10 -6
- package/dist/plain/calculate/setTime.js +4 -6
- package/dist/plain/calculate/startOfDate.d.ts +8 -2
- package/dist/plain/calculate/startOfDate.js +1 -2
- package/dist/plain/calculate/startOfDateTime.d.ts +15 -2
- package/dist/plain/calculate/startOfDateTime.js +1 -2
- package/dist/plain/calculate/startOfTime.d.ts +8 -1
- package/dist/plain/calculate/startOfTime.js +1 -1
- package/dist/plain/calculate/subtractDate.d.ts +7 -4
- package/dist/plain/calculate/subtractDate.js +1 -4
- package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
- package/dist/plain/calculate/subtractDateTime.js +1 -4
- package/dist/plain/compare/areDateTimesEqualBy.d.ts +13 -5
- package/dist/plain/compare/areDateTimesEqualBy.js +6 -5
- package/dist/plain/compare/areDatesEqualBy.d.ts +15 -6
- package/dist/plain/compare/areDatesEqualBy.js +8 -6
- package/dist/plain/compare/isBetweenDate.d.ts +13 -2
- package/dist/plain/compare/isBetweenDate.js +4 -4
- package/dist/plain/compare/isBetweenDateTime.d.ts +13 -2
- package/dist/plain/compare/isBetweenDateTime.js +4 -4
- package/dist/plain/compare/isBetweenTime.d.ts +13 -2
- package/dist/plain/compare/isBetweenTime.js +4 -4
- package/dist/plain/compare/isRelativeDay.d.ts +1 -1
- package/dist/plain/compare/isRelativeDay.js +1 -1
- package/dist/plain/compare/isThisUnit.d.ts +1 -1
- package/dist/plain/compare/isThisUnit.js +1 -1
- package/dist/plain/format/formatCalendar.d.ts +21 -14
- package/dist/plain/format/formatCalendar.js +21 -16
- package/dist/plain/format/formatDate.js +5 -3
- package/dist/plain/format/formatDateRange.js +4 -2
- package/dist/plain/format/formatDateTime.js +4 -2
- package/dist/plain/format/formatDateTimeRange.js +4 -2
- package/dist/plain/format/formatDateTimeToParts.d.ts +15 -4
- package/dist/plain/format/formatDateTimeToParts.js +10 -6
- package/dist/plain/format/formatDateToParts.d.ts +13 -2
- package/dist/plain/format/formatDateToParts.js +8 -4
- package/dist/plain/format/formatRelativeDate.d.ts +16 -3
- package/dist/plain/format/formatRelativeDate.js +26 -15
- package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
- package/dist/plain/format/formatRelativeDateTime.js +8 -5
- package/dist/plain/format/formatRelativeTime.d.ts +16 -3
- package/dist/plain/format/formatRelativeTime.js +21 -13
- package/dist/plain/format/formatTime.js +4 -2
- package/dist/plain/interval/intervalDifferenceDate.d.ts +9 -0
- package/dist/plain/interval/intervalDifferenceDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalDifferenceTime.d.ts +9 -0
- package/dist/plain/interval/intervalDivideEquallyDate.d.ts +19 -4
- package/dist/plain/interval/intervalDivideEquallyDate.js +3 -4
- package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +19 -4
- package/dist/plain/interval/intervalDivideEquallyDateTime.js +3 -4
- package/dist/plain/interval/intervalDivideEquallyTime.d.ts +19 -4
- package/dist/plain/interval/intervalDivideEquallyTime.js +3 -4
- package/dist/plain/interval/intervalFromDurationDate.d.ts +16 -3
- package/dist/plain/interval/intervalFromDurationDate.js +1 -3
- package/dist/plain/interval/intervalFromDurationDateTime.d.ts +16 -3
- package/dist/plain/interval/intervalFromDurationDateTime.js +1 -3
- package/dist/plain/interval/intervalFromDurationTime.d.ts +9 -0
- package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -0
- package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalIntersectionTime.d.ts +9 -0
- package/dist/plain/interval/intervalSplitAtDate.d.ts +11 -0
- package/dist/plain/interval/intervalSplitAtDate.js +2 -0
- package/dist/plain/interval/intervalSplitAtDateTime.d.ts +11 -0
- package/dist/plain/interval/intervalSplitAtDateTime.js +2 -0
- package/dist/plain/interval/intervalSplitAtTime.d.ts +11 -0
- package/dist/plain/interval/intervalSplitAtTime.js +2 -0
- package/dist/plain/interval/intervalUnionDate.d.ts +9 -0
- package/dist/plain/interval/intervalUnionDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalUnionTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllDate.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorDate.d.ts +9 -0
- package/dist/plain/interval/intervalXorDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorTime.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
- package/dist/plain/interval/splitIntervalByUnitDate.d.ts +23 -7
- package/dist/plain/interval/splitIntervalByUnitDate.js +7 -7
- package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -6
- package/dist/plain/interval/splitIntervalByUnitDateTime.js +6 -6
- package/dist/plain/interval/splitIntervalByUnitTime.d.ts +17 -4
- package/dist/plain/interval/splitIntervalByUnitTime.js +1 -4
- package/dist/plain/map/mapDatesInRange.d.ts +8 -4
- package/dist/plain/map/mapDatesInRange.js +1 -4
- package/dist/plain/parse/parseDateTimeWithPattern.d.ts +10 -7
- package/dist/plain/parse/parseDateTimeWithPattern.js +10 -7
- package/dist/plain/parse/parseDateWithPattern.d.ts +10 -7
- package/dist/plain/parse/parseDateWithPattern.js +10 -7
- package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
- package/dist/plain/parse/parseTimeWithPattern.js +10 -7
- package/dist/plain/parse/parseUnitFromDate.d.ts +11 -3
- package/dist/plain/parse/parseUnitFromDate.js +3 -3
- package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
- package/dist/plain/parse/parseUnitFromDateTime.js +3 -3
- package/dist/plain/parse/parseWeekFromDate.d.ts +10 -6
- package/dist/plain/parse/parseWeekFromDate.js +2 -6
- package/dist/plain/parse/parseWeekFromDateTime.d.ts +10 -6
- package/dist/plain/parse/parseWeekFromDateTime.js +2 -6
- package/dist/plain/validate/isValidDateRange.d.ts +19 -4
- package/dist/plain/validate/isValidDateRange.js +1 -4
- package/dist/plain/validate/isValidDateTimeRange.d.ts +20 -5
- package/dist/plain/validate/isValidDateTimeRange.js +2 -5
- package/dist/plain/validate/isValidTimeRange.d.ts +20 -5
- package/dist/plain/validate/isValidTimeRange.js +2 -5
- package/dist/precision/convert/fromExcelSerial.d.ts +10 -4
- package/dist/precision/convert/fromExcelSerial.js +4 -5
- package/dist/precision/convert/fromNanoseconds.d.ts +1 -1
- package/dist/precision/convert/fromNanoseconds.js +1 -1
- package/dist/precision/convert/toExcelSerial.d.ts +9 -3
- package/dist/precision/convert/toExcelSerial.js +3 -4
- package/dist/precision/convert/toNanoseconds.d.ts +11 -6
- package/dist/precision/convert/toNanoseconds.js +11 -6
- package/dist/precision/validate/isValidInstant.d.ts +12 -3
- package/dist/precision/validate/isValidInstant.js +12 -3
- package/dist/span/calculate/spanMs.d.ts +10 -4
- package/dist/span/calculate/spanMs.js +10 -4
- package/dist/span/calculate/spanNs.d.ts +10 -4
- package/dist/span/calculate/spanNs.js +10 -4
- package/dist/span/validate/isValidSpan.d.ts +8 -3
- package/dist/span/validate/isValidSpan.js +8 -3
- package/dist/transport/calculate/bestAvailable.d.ts +47 -0
- package/dist/transport/calculate/bestAvailable.js +76 -0
- package/dist/transport/calculate/crossingTime.d.ts +58 -0
- package/dist/transport/calculate/crossingTime.js +76 -0
- package/dist/transport/calculate/cutoffAt.d.ts +90 -0
- package/dist/transport/calculate/cutoffAt.js +209 -0
- package/dist/transport/calculate/cutoffSchedule.d.ts +70 -0
- package/dist/transport/calculate/cutoffSchedule.js +71 -0
- package/dist/transport/calculate/dwellTime.d.ts +16 -7
- package/dist/transport/calculate/dwellTime.js +12 -8
- package/dist/transport/calculate/estimateDrift.d.ts +65 -0
- package/dist/transport/calculate/estimateDrift.js +75 -0
- package/dist/transport/calculate/index.d.ts +8 -0
- package/dist/transport/calculate/index.js +8 -0
- package/dist/transport/calculate/nextDeparture.d.ts +78 -0
- package/dist/transport/calculate/nextDeparture.js +131 -0
- package/dist/transport/calculate/punctualityRate.d.ts +42 -0
- package/dist/transport/calculate/punctualityRate.js +59 -0
- package/dist/transport/calculate/scheduleDelivery.d.ts +150 -0
- package/dist/transport/calculate/scheduleDelivery.js +300 -0
- package/dist/transport/calculate/transitTime.d.ts +21 -3
- package/dist/transport/calculate/transitTime.js +29 -46
- package/dist/transport/compare/classifyPunctuality.d.ts +46 -0
- package/dist/transport/compare/classifyPunctuality.js +64 -0
- package/dist/transport/compare/index.d.ts +4 -0
- package/dist/transport/compare/index.js +4 -0
- package/dist/transport/compare/isPastCutoff.d.ts +33 -0
- package/dist/transport/compare/isPastCutoff.js +48 -0
- package/dist/transport/compare/scheduleDeviation.d.ts +37 -0
- package/dist/transport/compare/scheduleDeviation.js +53 -0
- package/dist/transport/compare/timeToCutoff.d.ts +31 -0
- package/dist/transport/compare/timeToCutoff.js +47 -0
- package/dist/transport/convert/etaAtZone.d.ts +7 -0
- package/dist/transport/convert/etaAtZone.js +9 -4
- package/dist/transport/index.d.ts +1 -0
- package/dist/transport/index.js +1 -0
- package/dist/types/business-calendar.d.ts +19 -14
- package/dist/types/calendar-options.d.ts +15 -3
- package/dist/types/date-cycle-field.d.ts +5 -0
- package/dist/types/date-duration-unit.d.ts +4 -0
- package/dist/types/date-time-cycle-field.d.ts +4 -0
- package/dist/types/date-time-duration-units.d.ts +4 -0
- package/dist/types/date-time-unit.d.ts +4 -0
- package/dist/types/date-unit.d.ts +4 -0
- package/dist/types/disambiguation.d.ts +8 -0
- package/dist/types/duration-relative-to.d.ts +8 -0
- package/dist/types/duration-string-options.d.ts +28 -0
- package/dist/types/fiscal-calendar.d.ts +1 -1
- package/dist/types/fractional-digit.d.ts +5 -0
- package/dist/types/free-time-options.d.ts +21 -11
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.js +2 -1
- package/dist/types/interval.d.ts +8 -1
- package/dist/types/offset.d.ts +9 -0
- package/dist/types/operating-schedule.d.ts +71 -0
- package/dist/types/overflow.d.ts +6 -0
- package/dist/types/relative-rounding-method.d.ts +6 -0
- package/dist/types/relative-time-options.d.ts +33 -5
- package/dist/types/rounding-options.d.ts +27 -0
- package/dist/types/time-cycle-field.d.ts +4 -0
- package/dist/types/time-duration-unit.d.ts +4 -0
- package/dist/types/time-unit.d.ts +4 -0
- package/dist/types/transport-timestamps.d.ts +54 -0
- package/dist/types/transport-timestamps.js +0 -0
- package/dist/unix/calculate/addUnix.d.ts +19 -5
- package/dist/unix/calculate/addUnix.js +1 -5
- package/dist/unix/calculate/diffUnix.d.ts +13 -3
- package/dist/unix/calculate/diffUnix.js +1 -3
- package/dist/unix/calculate/diffUnixAsDuration.d.ts +13 -3
- package/dist/unix/calculate/diffUnixAsDuration.js +1 -3
- package/dist/unix/calculate/endOfQuarterForUnix.d.ts +13 -3
- package/dist/unix/calculate/endOfQuarterForUnix.js +1 -3
- package/dist/unix/calculate/endOfUnix.d.ts +20 -4
- package/dist/unix/calculate/endOfUnix.js +1 -4
- package/dist/unix/calculate/isBetweenUnix.d.ts +26 -4
- package/dist/unix/calculate/isBetweenUnix.js +4 -6
- package/dist/unix/calculate/roundUnix.d.ts +31 -3
- package/dist/unix/calculate/roundUnix.js +3 -6
- package/dist/unix/calculate/setUnix.d.ts +35 -9
- package/dist/unix/calculate/setUnix.js +4 -13
- package/dist/unix/calculate/startOfQuarterForUnix.d.ts +13 -3
- package/dist/unix/calculate/startOfQuarterForUnix.js +1 -3
- package/dist/unix/calculate/startOfUnix.d.ts +20 -4
- package/dist/unix/calculate/startOfUnix.js +1 -4
- package/dist/unix/calculate/subtractUnix.d.ts +19 -5
- package/dist/unix/calculate/subtractUnix.js +1 -5
- package/dist/unix/compare/areUnixEqual.d.ts +7 -1
- package/dist/unix/compare/areUnixEqual.js +1 -1
- package/dist/unix/compare/areUnixEqualBy.d.ts +24 -7
- package/dist/unix/compare/areUnixEqualBy.js +13 -9
- package/dist/unix/compare/isAfterUnix.d.ts +7 -1
- package/dist/unix/compare/isAfterUnix.js +1 -1
- package/dist/unix/compare/isBeforeUnix.d.ts +7 -1
- package/dist/unix/compare/isBeforeUnix.js +1 -1
- package/dist/unix/convert/convertUnixToPlainDate.d.ts +14 -4
- package/dist/unix/convert/convertUnixToPlainDate.js +2 -4
- package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +14 -4
- package/dist/unix/convert/convertUnixToPlainDateTime.js +2 -4
- package/dist/unix/convert/convertUnixToPlainTime.d.ts +14 -4
- package/dist/unix/convert/convertUnixToPlainTime.js +2 -4
- package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
- package/dist/unix/convert/convertUnixToUtc.js +3 -4
- package/dist/unix/convert/convertUnixToZoned.d.ts +10 -5
- package/dist/unix/convert/convertUnixToZoned.js +4 -5
- package/dist/unix/format/formatCalendarUnix.d.ts +27 -19
- package/dist/unix/format/formatCalendarUnix.js +4 -5
- package/dist/unix/format/formatRelativeUnix.d.ts +54 -5
- package/dist/unix/format/formatRelativeUnix.js +3 -5
- package/dist/unix/format/formatUnix.d.ts +24 -6
- package/dist/unix/format/formatUnix.js +8 -7
- package/dist/unix/get/getUnixNow.d.ts +8 -3
- package/dist/unix/get/getUnixNow.js +1 -3
- package/dist/unix/interval/intervalCountUnix.d.ts +14 -5
- package/dist/unix/interval/intervalCountUnix.js +2 -5
- package/dist/unix/interval/intervalDifferenceUnix.d.ts +6 -0
- package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +18 -4
- package/dist/unix/interval/intervalDivideEquallyUnix.js +5 -4
- package/dist/unix/interval/intervalFromDurationUnix.d.ts +33 -5
- package/dist/unix/interval/intervalFromDurationUnix.js +6 -5
- package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
- package/dist/unix/interval/intervalLengthUnix.d.ts +16 -6
- package/dist/unix/interval/intervalLengthUnix.js +4 -6
- package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +13 -3
- package/dist/unix/interval/intervalOverlappingDaysUnix.js +1 -3
- package/dist/unix/interval/intervalSplitAtUnix.d.ts +8 -0
- package/dist/unix/interval/intervalSplitAtUnix.js +2 -0
- package/dist/unix/interval/intervalUnionUnix.d.ts +6 -0
- package/dist/unix/interval/intervalXorAllUnix.d.ts +6 -0
- package/dist/unix/interval/intervalXorUnix.d.ts +6 -0
- package/dist/unix/interval/mergeIntervalsUnix.d.ts +6 -0
- package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +42 -11
- package/dist/unix/interval/splitIntervalByUnitUnix.js +21 -16
- package/dist/unix/parse/parseDateFromUnix.d.ts +13 -2
- package/dist/unix/parse/parseDateFromUnix.js +1 -2
- package/dist/unix/parse/parseDayFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseDayFromUnix.js +2 -2
- package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +13 -1
- package/dist/unix/parse/parseDayOfWeekFromUnix.js +1 -1
- package/dist/unix/parse/parseHourFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseHourFromUnix.js +2 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
- package/dist/unix/parse/parseMillisecondFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
- package/dist/unix/parse/parseMinuteFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
- package/dist/unix/parse/parseMonthFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseMonthFromUnix.js +2 -2
- package/dist/unix/parse/parseNanosecondFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
- package/dist/unix/parse/parseSecondFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseSecondFromUnix.js +2 -2
- package/dist/unix/parse/parseTimeFromUnix.d.ts +13 -2
- package/dist/unix/parse/parseTimeFromUnix.js +1 -2
- package/dist/unix/parse/parseUnitFromUnix.d.ts +22 -3
- package/dist/unix/parse/parseUnitFromUnix.js +2 -3
- package/dist/unix/parse/parseWeekFromUnix.d.ts +23 -7
- package/dist/unix/parse/parseWeekFromUnix.js +3 -7
- package/dist/unix/parse/parseYearFromUnix.d.ts +14 -2
- package/dist/unix/parse/parseYearFromUnix.js +2 -2
- package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
- package/dist/unix/validate/isValidUnixRange.js +1 -4
- package/dist/utc/calculate/addUtc.d.ts +7 -4
- package/dist/utc/calculate/addUtc.js +1 -4
- package/dist/utc/calculate/diffUtc.d.ts +1 -1
- package/dist/utc/calculate/diffUtc.js +1 -1
- package/dist/utc/calculate/diffUtcAsDuration.d.ts +1 -1
- package/dist/utc/calculate/diffUtcAsDuration.js +1 -1
- package/dist/utc/calculate/endOfUtc.d.ts +16 -3
- package/dist/utc/calculate/endOfUtc.js +2 -3
- package/dist/utc/calculate/isBetweenUtc.d.ts +13 -2
- package/dist/utc/calculate/isBetweenUtc.js +4 -4
- package/dist/utc/calculate/roundUtc.d.ts +26 -9
- package/dist/utc/calculate/roundUtc.js +3 -12
- package/dist/utc/calculate/setUtc.d.ts +7 -4
- package/dist/utc/calculate/setUtc.js +1 -4
- package/dist/utc/calculate/startOfUtc.d.ts +15 -2
- package/dist/utc/calculate/startOfUtc.js +1 -2
- package/dist/utc/calculate/subtractUtc.d.ts +7 -4
- package/dist/utc/calculate/subtractUtc.js +1 -4
- package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
- package/dist/utc/compare/areUtcEqualBy.js +2 -3
- package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -3
- package/dist/utc/convert/convertUtcToPlainDate.js +5 -6
- package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +8 -3
- package/dist/utc/convert/convertUtcToPlainDateTime.js +5 -6
- package/dist/utc/convert/convertUtcToPlainTime.d.ts +8 -3
- package/dist/utc/convert/convertUtcToPlainTime.js +5 -6
- package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
- package/dist/utc/convert/convertUtcToUnix.js +3 -4
- package/dist/utc/convert/convertUtcToZoned.d.ts +1 -1
- package/dist/utc/convert/convertUtcToZoned.js +1 -1
- package/dist/utc/format/formatCalendarUtc.d.ts +19 -8
- package/dist/utc/format/formatCalendarUtc.js +8 -6
- package/dist/utc/format/formatHttp.d.ts +1 -1
- package/dist/utc/format/formatHttp.js +1 -1
- package/dist/utc/format/formatRelativeUtc.d.ts +30 -10
- package/dist/utc/format/formatRelativeUtc.js +9 -11
- package/dist/utc/format/formatUtc.d.ts +17 -15
- package/dist/utc/format/formatUtc.js +8 -8
- package/dist/utc/interval/intervalDifferenceUtc.d.ts +6 -0
- package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +18 -4
- package/dist/utc/interval/intervalDivideEquallyUtc.js +5 -4
- package/dist/utc/interval/intervalFromDurationUtc.d.ts +13 -3
- package/dist/utc/interval/intervalFromDurationUtc.js +1 -3
- package/dist/utc/interval/intervalIntersectionUtc.d.ts +6 -0
- package/dist/utc/interval/intervalSplitAtUtc.d.ts +8 -0
- package/dist/utc/interval/intervalSplitAtUtc.js +2 -0
- package/dist/utc/interval/intervalUnionUtc.d.ts +6 -0
- package/dist/utc/interval/intervalXorAllUtc.d.ts +6 -0
- package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
- package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
- package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
- package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
- package/dist/utc/parse/parseDateFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseDateFromUtc.js +1 -3
- package/dist/utc/parse/parseDayFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseDayFromUtc.js +1 -3
- package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -6
- package/dist/utc/parse/parseHourFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseHourFromUtc.js +1 -3
- package/dist/utc/parse/parseHttp.d.ts +1 -1
- package/dist/utc/parse/parseHttp.js +1 -1
- package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseMicrosecondFromUtc.js +1 -3
- package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseMillisecondFromUtc.js +1 -3
- package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseMinuteFromUtc.js +1 -3
- package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseMonthFromUtc.js +1 -3
- package/dist/utc/parse/parseNanosecondFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseNanosecondFromUtc.js +1 -3
- package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseSecondFromUtc.js +1 -3
- package/dist/utc/parse/parseTimeFromUtc.d.ts +8 -3
- package/dist/utc/parse/parseTimeFromUtc.js +5 -6
- package/dist/utc/parse/parseUnitFromUtc.d.ts +17 -5
- package/dist/utc/parse/parseUnitFromUtc.js +6 -8
- package/dist/utc/parse/parseWeekFromUtc.d.ts +18 -10
- package/dist/utc/parse/parseWeekFromUtc.js +7 -13
- package/dist/utc/parse/parseYearFromUtc.d.ts +7 -3
- package/dist/utc/parse/parseYearFromUtc.js +1 -3
- package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
- package/dist/utc/validate/isValidUtcRange.js +2 -5
- package/dist/zoned/calculate/addZoned.d.ts +20 -10
- package/dist/zoned/calculate/addZoned.js +6 -13
- package/dist/zoned/calculate/cycleZoned.d.ts +33 -8
- package/dist/zoned/calculate/cycleZoned.js +1 -8
- package/dist/zoned/calculate/diffZoned.d.ts +1 -1
- package/dist/zoned/calculate/diffZoned.js +1 -1
- package/dist/zoned/calculate/diffZonedAsDuration.d.ts +1 -1
- package/dist/zoned/calculate/diffZonedAsDuration.js +1 -1
- package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +9 -2
- package/dist/zoned/calculate/endOfQuarterForZoned.js +4 -5
- package/dist/zoned/calculate/endOfZoned.d.ts +16 -3
- package/dist/zoned/calculate/endOfZoned.js +2 -3
- package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +10 -3
- package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +5 -6
- package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +7 -1
- package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +3 -4
- package/dist/zoned/calculate/roundZoned.d.ts +21 -4
- package/dist/zoned/calculate/roundZoned.js +3 -7
- package/dist/zoned/calculate/setZoned.d.ts +25 -8
- package/dist/zoned/calculate/setZoned.js +4 -12
- package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +7 -2
- package/dist/zoned/calculate/startOfQuarterForZoned.js +3 -5
- package/dist/zoned/calculate/startOfZoned.d.ts +15 -3
- package/dist/zoned/calculate/startOfZoned.js +1 -3
- package/dist/zoned/calculate/subtractZoned.d.ts +20 -10
- package/dist/zoned/calculate/subtractZoned.js +6 -13
- package/dist/zoned/compare/areZonedEqualBy.d.ts +14 -5
- package/dist/zoned/compare/areZonedEqualBy.js +7 -5
- package/dist/zoned/compare/isBetweenZoned.d.ts +13 -1
- package/dist/zoned/compare/isBetweenZoned.js +4 -3
- package/dist/zoned/compare/isInDaylightSaving.d.ts +38 -11
- package/dist/zoned/compare/isInDaylightSaving.js +40 -44
- package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +18 -5
- package/dist/zoned/convert/convertPlainDateTimeToZoned.js +6 -11
- package/dist/zoned/convert/convertZonedToUnix.d.ts +9 -4
- package/dist/zoned/convert/convertZonedToUnix.js +2 -4
- package/dist/zoned/convert/convertZonedToZoned.d.ts +1 -1
- package/dist/zoned/convert/convertZonedToZoned.js +1 -1
- package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
- package/dist/zoned/format/formatCalendarZoned.js +13 -9
- package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
- package/dist/zoned/format/formatRelativeZoned.js +7 -4
- package/dist/zoned/format/formatRfc2822.d.ts +2 -2
- package/dist/zoned/format/formatRfc2822.js +2 -2
- package/dist/zoned/format/formatRfc3339.d.ts +2 -3
- package/dist/zoned/format/formatRfc3339.js +2 -3
- package/dist/zoned/format/formatTimeZoneName.d.ts +12 -3
- package/dist/zoned/format/formatTimeZoneName.js +5 -4
- package/dist/zoned/format/formatZonedDateTime.js +2 -1
- package/dist/zoned/format/formatZonedRange.js +2 -1
- package/dist/zoned/format/formatZonedToParts.d.ts +15 -4
- package/dist/zoned/format/formatZonedToParts.js +8 -5
- package/dist/zoned/get/getDstTransitions.d.ts +9 -10
- package/dist/zoned/get/getDstTransitions.js +12 -3
- package/dist/zoned/get/getTimeZoneOffset.d.ts +4 -1
- package/dist/zoned/get/getTimeZoneOffset.js +6 -3
- package/dist/zoned/get/getZonedNow.d.ts +13 -1
- package/dist/zoned/get/getZonedNow.js +12 -3
- package/dist/zoned/interval/intervalDifferenceZoned.d.ts +9 -0
- package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +22 -4
- package/dist/zoned/interval/intervalDivideEquallyZoned.js +6 -4
- package/dist/zoned/interval/intervalFromDurationZoned.d.ts +29 -10
- package/dist/zoned/interval/intervalFromDurationZoned.js +6 -13
- package/dist/zoned/interval/intervalIntersectionZoned.d.ts +9 -0
- package/dist/zoned/interval/intervalSplitAtZoned.d.ts +11 -0
- package/dist/zoned/interval/intervalSplitAtZoned.js +2 -0
- package/dist/zoned/interval/intervalUnionZoned.d.ts +9 -0
- package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -0
- package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
- package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
- package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +27 -6
- package/dist/zoned/interval/splitIntervalByUnitZoned.js +11 -6
- package/dist/zoned/map/mapZonedDatesInRange.d.ts +9 -4
- package/dist/zoned/map/mapZonedDatesInRange.js +2 -4
- package/dist/zoned/parse/parseRfc2822.d.ts +1 -1
- package/dist/zoned/parse/parseRfc2822.js +1 -1
- package/dist/zoned/parse/parseUnitFromZoned.d.ts +9 -3
- package/dist/zoned/parse/parseUnitFromZoned.js +1 -3
- package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
- package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
- package/dist/zoned/validate/hasDaylightSaving.d.ts +42 -11
- package/dist/zoned/validate/hasDaylightSaving.js +47 -31
- package/dist/zoned/validate/isValidZonedDateTime.d.ts +13 -0
- package/dist/zoned/validate/isValidZonedDateTime.js +14 -1
- package/dist/zoned/validate/isValidZonedRange.d.ts +15 -4
- package/dist/zoned/validate/isValidZonedRange.js +1 -4
- package/package.json +18 -5
- package/skills/gmt-arithmetic/SKILL.md +1 -1
- package/skills/gmt-basics/SKILL.md +10 -1
- package/skills/gmt-integration/SKILL.md +10 -5
- package/skills/gmt-timezone/SKILL.md +150 -21
- package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
- package/dist/internal/resolveReadingTimeZone.js +0 -18
- package/dist/types/duration-unit.d.ts +0 -5
- /package/dist/types/{duration-unit.js → operating-schedule.js} +0 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { MAX_EPOCH_NANOSECONDS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
|
|
3
|
+
import { POLYFILL_TRANSITION_SEARCH_FLOOR, missedNextTransition, missedPreviousTransition, offsetAt, transitionBetween, } from "./zonedWallClock.js";
|
|
4
|
+
/*
|
|
5
|
+
* ---------------------------------------------------------------------------------------------
|
|
6
|
+
* GMT's own time zone transition search (temporalCompat D13; `zonedWallClock.ts` defect 5)
|
|
7
|
+
* ---------------------------------------------------------------------------------------------
|
|
8
|
+
* TC39 `GetNamedTimeZoneNextTransition` / `GetNamedTimeZonePreviousTransition`: the first offset
|
|
9
|
+
* change strictly after an instant, and the last strictly before it. `@js-temporal/polyfill`
|
|
10
|
+
* 0.5.1 samples the offset every 14 days and bisects a step whose ends differ. Two changes inside
|
|
11
|
+
* one step break it: a pair that returns to the same offset is skipped (America/Boa_Vista,
|
|
12
|
+
* 2000-10-08 and 2000-10-15), and three different offsets make its bisection loop forever
|
|
13
|
+
* (Europe/Riga, 1944-10-02 and 1944-10-12).
|
|
14
|
+
*
|
|
15
|
+
* This search samples the same way with a step shorter than any gap between two changes in the
|
|
16
|
+
* tz database, so a step holds at most one change: equal ends mean none, different ends mean
|
|
17
|
+
* exactly one, and bisecting it always narrows.
|
|
18
|
+
*
|
|
19
|
+
* The sampling assumption, pinned by the all-zones guard in `zonedTransitionSearch.test.ts`: no
|
|
20
|
+
* zone changes its offset twice within `TRANSITION_SEARCH_STEP_NANOSECONDS`. The closest pair in
|
|
21
|
+
* tz 2026c is 601,200 s apart (America/Boa_Vista, Noronha and Recife in 2000; Asia/Gaza and
|
|
22
|
+
* Asia/Hebron in 2040), measured with `zdump -v`. The step is 432,000 s (5 days), 169,200 s
|
|
23
|
+
* under that. A tz release with a closer pair fails the guard.
|
|
24
|
+
*
|
|
25
|
+
* "No further change" follows the polyfill's own rule, so removal changes no answer: a forward
|
|
26
|
+
* search stops three 366-day years past the later of its start and the current instant, and a
|
|
27
|
+
* backward search stops at 1847-01-01, before which the one earlier change a zone can have is
|
|
28
|
+
* found by comparing offsets (`missedNextTransition`, `missedPreviousTransition`).
|
|
29
|
+
*
|
|
30
|
+
* Bounds, in offset reads (one `Intl` read each):
|
|
31
|
+
* - a limit instant only shortens a search; the horizon above applies with or without one, so a
|
|
32
|
+
* limit thousands of years away costs no more than none. Within the horizon: one read per 5
|
|
33
|
+
* days of the limit, plus at most 51 to pin the change. The daylight rule passes 365 days: at
|
|
34
|
+
* most 74 + 51 reads.
|
|
35
|
+
* - forward: at most the steps from the start (1847 at the earliest) to three years past the later
|
|
36
|
+
* of the start and today, about 13,400 from 1847 and 220 from any later start; a system clock
|
|
37
|
+
* set absurdly far ahead stops at `MAX_SEARCH_STEPS` (200,000) with a RangeError.
|
|
38
|
+
* - backward: the same span, down to 1847. From more than three years past today: 220 reads over
|
|
39
|
+
* the three years before the instant; if nothing is there, one backward search from three years
|
|
40
|
+
* past today and then at most `MAX_TABLED_TRANSITIONS` (1,000) forward searches, then a
|
|
41
|
+
* RangeError.
|
|
42
|
+
*
|
|
43
|
+
* Removed with the D13 workaround: see `temporalCompat/README.md`.
|
|
44
|
+
* ---------------------------------------------------------------------------------------------
|
|
45
|
+
*/
|
|
46
|
+
const NANOSECONDS_PER_SECOND = 1000000000n;
|
|
47
|
+
const NANOSECONDS_PER_DAY = 86400n * NANOSECONDS_PER_SECOND;
|
|
48
|
+
/**
|
|
49
|
+
* The sampling step: 5 days. It must stay under the smallest gap between two offset changes of
|
|
50
|
+
* one zone, 601,200 s in tz 2026c (`zdump -v`, America/Boa_Vista 2000-10-08 to 2000-10-15).
|
|
51
|
+
*/
|
|
52
|
+
export const TRANSITION_SEARCH_STEP_NANOSECONDS = 432000n * NANOSECONDS_PER_SECOND;
|
|
53
|
+
/**
|
|
54
|
+
* js-temporal `GetNamedTimeZoneNextTransition`: "the farthest that we'll look for a next
|
|
55
|
+
* transition is 3 years after the later of epochNanoseconds or the current time"
|
|
56
|
+
* (`DAY_MS * 366 * 3`).
|
|
57
|
+
*/
|
|
58
|
+
const NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS = 3n * 366n * NANOSECONDS_PER_DAY;
|
|
59
|
+
/** Steps one search may take: 200,000 five-day steps is 2,700 years. */
|
|
60
|
+
const MAX_SEARCH_STEPS = 200_000;
|
|
61
|
+
/** Forward searches when walking a zone's tabled future changes; Africa/Casablanca has about 120. */
|
|
62
|
+
const MAX_TABLED_TRANSITIONS = 1_000;
|
|
63
|
+
/** Halvings to pin a whole second inside one step: 2^19 s is more than 5 days. */
|
|
64
|
+
const MAX_SECOND_BISECTION_STEPS = 20;
|
|
65
|
+
function minimum(a, b) {
|
|
66
|
+
return a < b ? a : b;
|
|
67
|
+
}
|
|
68
|
+
function maximum(a, b) {
|
|
69
|
+
return a > b ? a : b;
|
|
70
|
+
}
|
|
71
|
+
function floorSecond(epochNanoseconds) {
|
|
72
|
+
const seconds = epochNanoseconds / NANOSECONDS_PER_SECOND;
|
|
73
|
+
return epochNanoseconds % NANOSECONDS_PER_SECOND < 0n
|
|
74
|
+
? seconds - 1n
|
|
75
|
+
: seconds;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The one change in `(low, high]`, given that the offsets at the two ends differ and the window is
|
|
79
|
+
* no longer than a step. tz changes fall on whole seconds (RFC 9636 §3.2 stores transition times in
|
|
80
|
+
* seconds), so the search runs over seconds; the result is checked one nanosecond earlier, and a
|
|
81
|
+
* change that is not on a whole second is pinned to the nanosecond instead.
|
|
82
|
+
*/
|
|
83
|
+
function changeBetween(timeZone, low, high, lowOffset, highOffset) {
|
|
84
|
+
let before = floorSecond(low);
|
|
85
|
+
let after = floorSecond(high);
|
|
86
|
+
for (let i = 0; i < MAX_SECOND_BISECTION_STEPS && after - before > 1n; i++) {
|
|
87
|
+
const middle = (before + after) / 2n;
|
|
88
|
+
if (offsetAt(timeZone, middle * NANOSECONDS_PER_SECOND) === lowOffset) {
|
|
89
|
+
before = middle;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
after = middle;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const change = after * NANOSECONDS_PER_SECOND;
|
|
96
|
+
if (after - before === 1n &&
|
|
97
|
+
change > low &&
|
|
98
|
+
offsetAt(timeZone, change) === highOffset &&
|
|
99
|
+
offsetAt(timeZone, change - 1n) === lowOffset) {
|
|
100
|
+
return change;
|
|
101
|
+
}
|
|
102
|
+
return transitionBetween(timeZone, low, high, highOffset);
|
|
103
|
+
}
|
|
104
|
+
function currentEpochNanoseconds() {
|
|
105
|
+
return Temporal.Now.instant().epochNanoseconds;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* TC39 `GetNamedTimeZoneNextTransition`: the first offset change strictly after `from`.
|
|
109
|
+
*
|
|
110
|
+
* @param timeZone a named zone
|
|
111
|
+
* @param from the instant to search after (exclusive)
|
|
112
|
+
* @param until optional: the last instant to search (inclusive); a later change returns null
|
|
113
|
+
* @returns the change's epoch nanoseconds, or null when there is none up to `until` or none within
|
|
114
|
+
* three years of the later of `from` and the current instant
|
|
115
|
+
* @throws RangeError past `MAX_SEARCH_STEPS` steps
|
|
116
|
+
*/
|
|
117
|
+
export function nextTransitionAfter(timeZone, from, until) {
|
|
118
|
+
// The horizon holds with or without a limit, as it does when the polyfill answers and the
|
|
119
|
+
// limit only filters its result.
|
|
120
|
+
const horizon = maximum(from, currentEpochNanoseconds()) +
|
|
121
|
+
NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS;
|
|
122
|
+
const end = minimum(MAX_EPOCH_NANOSECONDS, until === undefined ? horizon : minimum(until, horizon));
|
|
123
|
+
if (from >= end)
|
|
124
|
+
return null;
|
|
125
|
+
let low = from;
|
|
126
|
+
if (low < POLYFILL_TRANSITION_SEARCH_FLOOR) {
|
|
127
|
+
const missed = missedNextTransition(timeZone, low);
|
|
128
|
+
if (missed !== null)
|
|
129
|
+
return missed <= end ? missed : null;
|
|
130
|
+
if (end <= POLYFILL_TRANSITION_SEARCH_FLOOR)
|
|
131
|
+
return null;
|
|
132
|
+
low = POLYFILL_TRANSITION_SEARCH_FLOOR;
|
|
133
|
+
}
|
|
134
|
+
const lowOffset = offsetAt(timeZone, low);
|
|
135
|
+
for (let i = 0; i < MAX_SEARCH_STEPS; i++) {
|
|
136
|
+
const high = minimum(low + TRANSITION_SEARCH_STEP_NANOSECONDS, end);
|
|
137
|
+
const highOffset = offsetAt(timeZone, high);
|
|
138
|
+
if (highOffset !== lowOffset) {
|
|
139
|
+
return changeBetween(timeZone, low, high, lowOffset, highOffset);
|
|
140
|
+
}
|
|
141
|
+
if (high >= end)
|
|
142
|
+
return null;
|
|
143
|
+
low = high;
|
|
144
|
+
}
|
|
145
|
+
throw new RangeError(`Transition search in ${timeZone} ran past its bound`);
|
|
146
|
+
}
|
|
147
|
+
/** The last change in `(since, start]`, scanning back from `start`; null when there is none. */
|
|
148
|
+
function lastChangeBack(timeZone, start, since) {
|
|
149
|
+
let high = start;
|
|
150
|
+
const highOffset = offsetAt(timeZone, high);
|
|
151
|
+
for (let i = 0; i < MAX_SEARCH_STEPS; i++) {
|
|
152
|
+
if (high <= since)
|
|
153
|
+
return null;
|
|
154
|
+
const low = maximum(high - TRANSITION_SEARCH_STEP_NANOSECONDS, since);
|
|
155
|
+
const lowOffset = offsetAt(timeZone, low);
|
|
156
|
+
if (lowOffset !== highOffset) {
|
|
157
|
+
return changeBetween(timeZone, low, high, lowOffset, highOffset);
|
|
158
|
+
}
|
|
159
|
+
high = low;
|
|
160
|
+
}
|
|
161
|
+
throw new RangeError(`Transition search in ${timeZone} ran past its bound`);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* The last change before an instant more than three years past the current one. The polyfill's
|
|
165
|
+
* rule: when the zone has no change between now and three years from now, there is none later, so
|
|
166
|
+
* the answer is the last change before that horizon. A zone whose rules repeat has one in the
|
|
167
|
+
* three years before `from`. Otherwise its future changes are a finite table (Africa/Casablanca,
|
|
168
|
+
* to 2087), walked forward to its end. A change at or before `since` is not looked for.
|
|
169
|
+
*/
|
|
170
|
+
function previousTransitionFarAhead(timeZone, from, now, since) {
|
|
171
|
+
const recentStart = from - NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS;
|
|
172
|
+
const recent = lastChangeBack(timeZone, from - 1n, since === undefined ? recentStart : maximum(since, recentStart));
|
|
173
|
+
if (recent !== null)
|
|
174
|
+
return recent;
|
|
175
|
+
if (since !== undefined && since >= recentStart)
|
|
176
|
+
return null;
|
|
177
|
+
const horizon = now + NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS;
|
|
178
|
+
let last = previousTransitionBefore(timeZone, horizon, since);
|
|
179
|
+
if (last === null || last < now)
|
|
180
|
+
return last;
|
|
181
|
+
for (let i = 0; i < MAX_TABLED_TRANSITIONS; i++) {
|
|
182
|
+
const next = nextTransitionAfter(timeZone, last);
|
|
183
|
+
if (next === null || next >= from)
|
|
184
|
+
return last;
|
|
185
|
+
last = next;
|
|
186
|
+
}
|
|
187
|
+
throw new RangeError(`Transition walk in ${timeZone} ran past its bound`);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* TC39 `GetNamedTimeZonePreviousTransition`: the last offset change strictly before `from`.
|
|
191
|
+
*
|
|
192
|
+
* @param timeZone a named zone
|
|
193
|
+
* @param from the instant to search before (exclusive)
|
|
194
|
+
* @param since optional: the search stops here (exclusive); an earlier change returns null
|
|
195
|
+
* @returns the change's epoch nanoseconds, or null when there is none after `since`, or, with no
|
|
196
|
+
* `since`, none at all
|
|
197
|
+
* @throws RangeError past `MAX_SEARCH_STEPS` steps or `MAX_TABLED_TRANSITIONS` tabled changes
|
|
198
|
+
*/
|
|
199
|
+
export function previousTransitionBefore(timeZone, from, since) {
|
|
200
|
+
if (from <= MIN_EPOCH_NANOSECONDS)
|
|
201
|
+
return null;
|
|
202
|
+
// The horizon holds with or without a limit: see `nextTransitionAfter`.
|
|
203
|
+
const now = currentEpochNanoseconds();
|
|
204
|
+
if (from - 1n > now + NO_FURTHER_TRANSITION_HORIZON_NANOSECONDS) {
|
|
205
|
+
return previousTransitionFarAhead(timeZone, from, now, since);
|
|
206
|
+
}
|
|
207
|
+
const floor = maximum(since ?? POLYFILL_TRANSITION_SEARCH_FLOOR, POLYFILL_TRANSITION_SEARCH_FLOOR);
|
|
208
|
+
const found = from - 1n > floor ? lastChangeBack(timeZone, from - 1n, floor) : null;
|
|
209
|
+
if (found !== null)
|
|
210
|
+
return found;
|
|
211
|
+
if (since !== undefined && since >= POLYFILL_TRANSITION_SEARCH_FLOOR) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
const missed = missedPreviousTransition(timeZone, from);
|
|
215
|
+
return missed !== null && (since === undefined || missed > since)
|
|
216
|
+
? missed
|
|
217
|
+
: null;
|
|
218
|
+
}
|
|
@@ -15,8 +15,6 @@ type ResolvedOffsetOption = NonNullable<Offset>;
|
|
|
15
15
|
export type CarriedOffset = "absent" | "out-of-range" | {
|
|
16
16
|
nanoseconds: bigint;
|
|
17
17
|
};
|
|
18
|
-
/** TC39 `CheckISODaysRange`: a date may sit at most 10^8 days from the Unix epoch. */
|
|
19
|
-
export declare const MAX_ISO_EPOCH_DAYS = 100000000;
|
|
20
18
|
/**
|
|
21
19
|
* `getTimeZoneTransition("next")` looks at most three years (366-day years) past its receiver;
|
|
22
20
|
* a `null` from further than this from the maximum is the polyfill's own horizon, not defect 2.
|
|
@@ -35,21 +33,34 @@ export declare function isNearRangeEdge(date: Temporal.PlainDate): boolean;
|
|
|
35
33
|
export declare function isNamedTimeZone(timeZone: string): boolean;
|
|
36
34
|
/** TC39 `IsValidEpochNanoseconds`. */
|
|
37
35
|
export declare function isValidEpoch(epochNanoseconds: bigint): boolean;
|
|
36
|
+
/** UTC offset in force at an instant, reading the nearest limit for an instant outside the range. */
|
|
37
|
+
export declare function offsetAt(timeZone: string, epochNanoseconds: bigint): bigint;
|
|
38
38
|
/** TC39 `GetUTCEpochNanoseconds`: the wall clock read as if it were UTC (may lie outside the range). */
|
|
39
39
|
export declare function utcEpochNanoseconds(wall: Temporal.PlainDateTime): bigint;
|
|
40
40
|
/** TC39 `GetEpochNanosecondsFor`. */
|
|
41
41
|
export declare function epochNanosecondsFor(timeZone: string, wall: Temporal.PlainDateTime, disambiguation: ResolvedDisambiguation): bigint;
|
|
42
|
+
/**
|
|
43
|
+
* The first instant at or after `low` whose offset is `offset`, given that `low` has a different
|
|
44
|
+
* offset and `high` has `offset`: the transition between them, to the nanosecond.
|
|
45
|
+
*/
|
|
46
|
+
export declare function transitionBetween(timeZone: string, low: bigint, high: bigint, offset: bigint): bigint;
|
|
42
47
|
/**
|
|
43
48
|
* TC39 `GetStartOfDay`: the first valid wall-clock time on `date` in `timeZone` — midnight, or,
|
|
44
49
|
* when midnight is skipped, the transition that skips it.
|
|
45
50
|
*/
|
|
46
51
|
export declare function startOfDayEpochNanoseconds(timeZone: string, date: Temporal.PlainDate): bigint;
|
|
47
52
|
/**
|
|
48
|
-
* True when
|
|
49
|
-
*
|
|
50
|
-
* miss
|
|
53
|
+
* True when the polyfill's `GetStartOfDay` cannot be trusted for this date in a named zone: it
|
|
54
|
+
* lies before the transition search floor (defect 3), or its midnight is skipped while the
|
|
55
|
+
* runtime's transition search can miss the change that skips it (defect 5). A midnight that exists
|
|
56
|
+
* never reaches that search, so the polyfill's answer stands for it.
|
|
57
|
+
*/
|
|
58
|
+
export declare function needsOwnStartOfDaySearch(timeZone: string, value: Temporal.PlainDate | Temporal.ZonedDateTime): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* `needsOwnStartOfDaySearch` for a measure that also reads the next day's start (`hoursInDay`,
|
|
61
|
+
* rounding to the day).
|
|
51
62
|
*/
|
|
52
|
-
export declare function
|
|
63
|
+
export declare function needsOwnDayBoundsSearch(timeZone: string, zoned: Temporal.ZonedDateTime): boolean;
|
|
53
64
|
/**
|
|
54
65
|
* The first transition after `epochNanoseconds` in a named zone when it lies before the polyfill's
|
|
55
66
|
* search floor, which `getTimeZoneTransition("next")` skips; null for any instant at or after the
|
|
@@ -63,6 +74,8 @@ export declare function missedNextTransition(timeZone: string, epochNanoseconds:
|
|
|
63
74
|
* never changes between the minimum instant and there.
|
|
64
75
|
*/
|
|
65
76
|
export declare function missedPreviousTransition(timeZone: string, epochNanoseconds: bigint): bigint | null;
|
|
77
|
+
/** TC39 `RoundNumberToIncrement(value, 1 minute, "half-expand")`. */
|
|
78
|
+
export declare function roundToMinute(nanoseconds: bigint): bigint;
|
|
66
79
|
/** TC39 `InterpretISODateTimeOffset` for a named zone and a wall clock with a time of day. */
|
|
67
80
|
export declare function interpretISODateTimeOffset(timeZone: string, wall: Temporal.PlainDateTime, offset: CarriedOffset, disambiguation: ResolvedDisambiguation, offsetOption: ResolvedOffsetOption, matchMinutes: boolean): bigint;
|
|
68
81
|
/** A zone id as Temporal canonicalizes it, from an identifier or any RFC 9557 string. */
|
|
@@ -74,7 +87,8 @@ export declare function utcOffsetStringNanoseconds(offset: string): bigint;
|
|
|
74
87
|
*
|
|
75
88
|
* Returns the polyfill's result whenever it has one. When the polyfill throws for a named zone
|
|
76
89
|
* within a month of either range limit, the TC39 result is recomputed (see the note at the top
|
|
77
|
-
* of this file); every other failure re-throws the polyfill's own error.
|
|
90
|
+
* of this file); every other failure re-throws the polyfill's own error. A string whose offset
|
|
91
|
+
* is written with seconds is matched exactly, as TC39 requires (`matchSecondsOffsetExactly`).
|
|
78
92
|
*
|
|
79
93
|
* @param item RFC 9557 zoned string or ZonedDateTime-like property bag
|
|
80
94
|
* @param options Temporal `disambiguation` / `offset` / `overflow`
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
-
import { MAX_EPOCH_NANOSECONDS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
|
|
2
|
+
import { MAX_EPOCH_NANOSECONDS, MAX_ISO_EPOCH_DAYS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
|
|
3
|
+
import { isSecondsOffsetMatchCompatNeeded, isTransitionSearchCompatNeeded, } from "./temporalCompat/index.js";
|
|
4
|
+
import { optionOrDefault } from "./optionOrDefault.js";
|
|
3
5
|
const NANOSECONDS_PER_DAY = 86400000000000n;
|
|
4
6
|
const NANOSECONDS_PER_MINUTE = 60000000000n;
|
|
5
|
-
/** TC39 `CheckISODaysRange`: a date may sit at most 10^8 days from the Unix epoch. */
|
|
6
|
-
export const MAX_ISO_EPOCH_DAYS = 100_000_000;
|
|
7
7
|
/**
|
|
8
8
|
* Dates this many days from a range limit are the only ones either defect reaches: defect 1 needs
|
|
9
9
|
* a wall clock within a day of the limit, defect 2 a transition within the scan's two-week step.
|
|
@@ -74,7 +74,7 @@ function clampEpoch(epochNanoseconds) {
|
|
|
74
74
|
return epochNanoseconds;
|
|
75
75
|
}
|
|
76
76
|
/** UTC offset in force at an instant, reading the nearest limit for an instant outside the range. */
|
|
77
|
-
function offsetAt(timeZone, epochNanoseconds) {
|
|
77
|
+
export function offsetAt(timeZone, epochNanoseconds) {
|
|
78
78
|
return BigInt(new Temporal.ZonedDateTime(clampEpoch(epochNanoseconds), timeZone)
|
|
79
79
|
.offsetNanoseconds);
|
|
80
80
|
}
|
|
@@ -158,7 +158,7 @@ export function epochNanosecondsFor(timeZone, wall, disambiguation) {
|
|
|
158
158
|
* The first instant at or after `low` whose offset is `offset`, given that `low` has a different
|
|
159
159
|
* offset and `high` has `offset`: the transition between them, to the nanosecond.
|
|
160
160
|
*/
|
|
161
|
-
function transitionBetween(timeZone, low, high, offset) {
|
|
161
|
+
export function transitionBetween(timeZone, low, high, offset) {
|
|
162
162
|
if (offsetAt(timeZone, high) !== offset ||
|
|
163
163
|
offsetAt(timeZone, low) === offset) {
|
|
164
164
|
throw new RangeError(`No transition in ${timeZone} between the bounds`);
|
|
@@ -203,13 +203,52 @@ export function startOfDayEpochNanoseconds(timeZone, date) {
|
|
|
203
203
|
* may lie before the polyfill's transition search floor, so the polyfill's `GetStartOfDay` can
|
|
204
204
|
* miss a transition that skips it. A zoned value from 1847-01-03T00:00Z on reads no offset.
|
|
205
205
|
*/
|
|
206
|
-
|
|
206
|
+
function isBeforePolyfillTransitionSearch(value) {
|
|
207
207
|
if (value instanceof Temporal.ZonedDateTime) {
|
|
208
208
|
return (value.epochNanoseconds < FIRST_INSTANT_AFTER_TRANSITION_SEARCH_DATE &&
|
|
209
209
|
isBeforePolyfillTransitionSearch(value.toPlainDate()));
|
|
210
210
|
}
|
|
211
211
|
return (Temporal.PlainDate.compare(value, LAST_DATE_BEFORE_TRANSITION_SEARCH) <= 0);
|
|
212
212
|
}
|
|
213
|
+
/** True when no instant in `timeZone` has `date`'s midnight as its wall time (it is skipped). */
|
|
214
|
+
function isMidnightSkipped(timeZone, date) {
|
|
215
|
+
try {
|
|
216
|
+
return (possibleEpochNanoseconds(timeZone, date.withCalendar("iso8601").toPlainDateTime()).length === 0);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// Outside the representable range: the range-limit fallbacks decide.
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* True when the polyfill's `GetStartOfDay` cannot be trusted for this date in a named zone: it
|
|
225
|
+
* lies before the transition search floor (defect 3), or its midnight is skipped while the
|
|
226
|
+
* runtime's transition search can miss the change that skips it (defect 5). A midnight that exists
|
|
227
|
+
* never reaches that search, so the polyfill's answer stands for it.
|
|
228
|
+
*/
|
|
229
|
+
export function needsOwnStartOfDaySearch(timeZone, value) {
|
|
230
|
+
if (isBeforePolyfillTransitionSearch(value))
|
|
231
|
+
return true;
|
|
232
|
+
if (!isTransitionSearchCompatNeeded())
|
|
233
|
+
return false;
|
|
234
|
+
return isMidnightSkipped(timeZone, value instanceof Temporal.ZonedDateTime ? value.toPlainDate() : value);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* `needsOwnStartOfDaySearch` for a measure that also reads the next day's start (`hoursInDay`,
|
|
238
|
+
* rounding to the day).
|
|
239
|
+
*/
|
|
240
|
+
export function needsOwnDayBoundsSearch(timeZone, zoned) {
|
|
241
|
+
if (needsOwnStartOfDaySearch(timeZone, zoned))
|
|
242
|
+
return true;
|
|
243
|
+
if (!isTransitionSearchCompatNeeded())
|
|
244
|
+
return false;
|
|
245
|
+
try {
|
|
246
|
+
return isMidnightSkipped(timeZone, zoned.toPlainDate().add({ days: 1 }));
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
213
252
|
/**
|
|
214
253
|
* The first transition after `epochNanoseconds` in a named zone when it lies before the polyfill's
|
|
215
254
|
* search floor, which `getTimeZoneTransition("next")` skips; null for any instant at or after the
|
|
@@ -241,7 +280,7 @@ export function missedPreviousTransition(timeZone, epochNanoseconds) {
|
|
|
241
280
|
return transitionBetween(timeZone, MIN_EPOCH_NANOSECONDS, high, highOffset);
|
|
242
281
|
}
|
|
243
282
|
/** TC39 `RoundNumberToIncrement(value, 1 minute, "half-expand")`. */
|
|
244
|
-
function roundToMinute(nanoseconds) {
|
|
283
|
+
export function roundToMinute(nanoseconds) {
|
|
245
284
|
const sign = nanoseconds < 0n ? -1n : 1n;
|
|
246
285
|
const magnitude = nanoseconds * sign;
|
|
247
286
|
const quotient = magnitude / NANOSECONDS_PER_MINUTE;
|
|
@@ -303,14 +342,17 @@ export function utcOffsetStringNanoseconds(offset) {
|
|
|
303
342
|
const utcMidnight = Temporal.ZonedDateTime.from({ year: 1970, month: 1, day: 1, timeZone: "UTC", offset }, { offset: "use" });
|
|
304
343
|
return -utcMidnight.epochNanoseconds;
|
|
305
344
|
}
|
|
306
|
-
/**
|
|
345
|
+
/**
|
|
346
|
+
* TC39 `ToTemporalZonedDateTime` for a zoned string in a named zone, from the wall clock and
|
|
347
|
+
* zone Temporal has already parsed: the epoch nanoseconds the string names. Used where the
|
|
348
|
+
* polyfill's own answer is unusable: near the range limits (defect 1) and for an offset written
|
|
349
|
+
* with seconds (defect 4).
|
|
350
|
+
*/
|
|
307
351
|
function stringEpochAtEdge(item, timeZone, wall, options) {
|
|
308
352
|
if (!TIME_SEPARATOR.test(item)) {
|
|
309
353
|
return startOfDayEpochNanoseconds(timeZone, wall.toPlainDate());
|
|
310
354
|
}
|
|
311
|
-
const disambiguation = options?.disambiguation
|
|
312
|
-
? "compatible"
|
|
313
|
-
: options.disambiguation;
|
|
355
|
+
const disambiguation = optionOrDefault(options?.disambiguation, "compatible");
|
|
314
356
|
if (!UTC_OFFSET.test(item)) {
|
|
315
357
|
return epochNanosecondsFor(timeZone, wall, disambiguation);
|
|
316
358
|
}
|
|
@@ -325,7 +367,7 @@ function stringEpochAtEdge(item, timeZone, wall, options) {
|
|
|
325
367
|
// The grammar is already proven valid, so only the string's own instant can be out of range.
|
|
326
368
|
offset = "out-of-range";
|
|
327
369
|
}
|
|
328
|
-
return interpretISODateTimeOffset(timeZone, wall, offset, disambiguation, options?.offset
|
|
370
|
+
return interpretISODateTimeOffset(timeZone, wall, offset, disambiguation, optionOrDefault(options?.offset, "reject"), !UTC_OFFSET_WITH_SECONDS.test(item));
|
|
329
371
|
}
|
|
330
372
|
function fromStringAtEdge(item, options) {
|
|
331
373
|
let wall;
|
|
@@ -367,9 +409,7 @@ function fromBagAtEdge(item, options) {
|
|
|
367
409
|
if (!isNamedTimeZone(timeZone) || !isNearRangeEdge(wall.toPlainDate())) {
|
|
368
410
|
return null;
|
|
369
411
|
}
|
|
370
|
-
const epoch = interpretISODateTimeOffset(timeZone, wall, offset, options?.disambiguation
|
|
371
|
-
? "compatible"
|
|
372
|
-
: options.disambiguation, options?.offset === undefined ? "reject" : options.offset, false);
|
|
412
|
+
const epoch = interpretISODateTimeOffset(timeZone, wall, offset, optionOrDefault(options?.disambiguation, "compatible"), optionOrDefault(options?.offset, "reject"), false);
|
|
373
413
|
return new Temporal.ZonedDateTime(epoch, timeZone, wall.calendarId);
|
|
374
414
|
}
|
|
375
415
|
/**
|
|
@@ -389,17 +429,43 @@ function dateOnlyBeforeTransitionSearch(item, options) {
|
|
|
389
429
|
catch {
|
|
390
430
|
return null;
|
|
391
431
|
}
|
|
392
|
-
if (!isNamedTimeZone(timeZone) || !
|
|
432
|
+
if (!isNamedTimeZone(timeZone) || !needsOwnStartOfDaySearch(timeZone, date)) {
|
|
393
433
|
return null;
|
|
394
434
|
}
|
|
395
435
|
return new Temporal.ZonedDateTime(startOfDayEpochNanoseconds(timeZone, date), timeZone, date.calendarId);
|
|
396
436
|
}
|
|
437
|
+
/**
|
|
438
|
+
* The polyfill's result for a zoned string, or the TC39 result when the polyfill matched an
|
|
439
|
+
* offset written with seconds by minutes (defect 4, temporalCompat D12).
|
|
440
|
+
*
|
|
441
|
+
* Dormant unless the D12 probe fails. Then it acts only on a string whose offset has a seconds
|
|
442
|
+
* part, read with `offset: "reject"` or `"prefer"` (the two options that match the offset
|
|
443
|
+
* against the zone), whose result has a sub-minute offset: any other result was matched exactly,
|
|
444
|
+
* because an earlier candidate would have matched by rounding first. For those it recomputes
|
|
445
|
+
* `InterpretISODateTimeOffset` with match-exactly, which throws a `RangeError` under `"reject"`
|
|
446
|
+
* when no candidate has the written offset.
|
|
447
|
+
*/
|
|
448
|
+
function matchSecondsOffsetExactly(item, zoned, options) {
|
|
449
|
+
if (!UTC_OFFSET_WITH_SECONDS.test(item) ||
|
|
450
|
+
BigInt(zoned.offsetNanoseconds) % NANOSECONDS_PER_MINUTE === 0n ||
|
|
451
|
+
options?.offset === "use" ||
|
|
452
|
+
options?.offset === "ignore" ||
|
|
453
|
+
!isSecondsOffsetMatchCompatNeeded()) {
|
|
454
|
+
return zoned;
|
|
455
|
+
}
|
|
456
|
+
const wall = Temporal.PlainDateTime.from(item).withCalendar("iso8601");
|
|
457
|
+
const epoch = stringEpochAtEdge(item, zoned.timeZoneId, wall, options);
|
|
458
|
+
return epoch === zoned.epochNanoseconds
|
|
459
|
+
? zoned
|
|
460
|
+
: new Temporal.ZonedDateTime(epoch, zoned.timeZoneId, zoned.calendarId);
|
|
461
|
+
}
|
|
397
462
|
/**
|
|
398
463
|
* `Temporal.ZonedDateTime.from`, correct across the whole representable range.
|
|
399
464
|
*
|
|
400
465
|
* Returns the polyfill's result whenever it has one. When the polyfill throws for a named zone
|
|
401
466
|
* within a month of either range limit, the TC39 result is recomputed (see the note at the top
|
|
402
|
-
* of this file); every other failure re-throws the polyfill's own error.
|
|
467
|
+
* of this file); every other failure re-throws the polyfill's own error. A string whose offset
|
|
468
|
+
* is written with seconds is matched exactly, as TC39 requires (`matchSecondsOffsetExactly`).
|
|
403
469
|
*
|
|
404
470
|
* @param item RFC 9557 zoned string or ZonedDateTime-like property bag
|
|
405
471
|
* @param options Temporal `disambiguation` / `offset` / `overflow`
|
|
@@ -413,7 +479,10 @@ export function zonedDateTimeFrom(item, options) {
|
|
|
413
479
|
return dateOnly;
|
|
414
480
|
}
|
|
415
481
|
try {
|
|
416
|
-
|
|
482
|
+
const zoned = Temporal.ZonedDateTime.from(item, options);
|
|
483
|
+
return typeof item === "string"
|
|
484
|
+
? matchSecondsOffsetExactly(item, zoned, options)
|
|
485
|
+
: zoned;
|
|
417
486
|
}
|
|
418
487
|
catch (error) {
|
|
419
488
|
const recovered = typeof item === "string"
|
|
@@ -40,28 +40,40 @@ export declare function zonedWithPlainTime(zoned: Temporal.ZonedDateTime, time?:
|
|
|
40
40
|
*/
|
|
41
41
|
export declare function zonedHoursInDay(zoned: Temporal.ZonedDateTime): number;
|
|
42
42
|
/**
|
|
43
|
-
* `ZonedDateTime#getTimeZoneTransition("next")
|
|
43
|
+
* `ZonedDateTime#getTimeZoneTransition("next")`: TC39 `GetNamedTimeZoneNextTransition`, the first
|
|
44
|
+
* offset change strictly after `zoned`.
|
|
44
45
|
*
|
|
45
|
-
* -
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
46
|
+
* - While the D13 probe fails (two changes inside one of the polyfill's 14-day search steps are
|
|
47
|
+
* skipped, or stall it for ever), a named zone is searched by GMT's own bounded search
|
|
48
|
+
* (`zonedTransitionSearch.ts`) and the polyfill's search is never called.
|
|
49
|
+
* - Otherwise the polyfill answers, corrected before 1847 (defect 3: it never searches there, so
|
|
50
|
+
* the change is found by bisection first) and within its three-year horizon of the maximum
|
|
51
|
+
* instant (defect 2: its forward scan gives up once a step would pass the maximum, so a `null`
|
|
52
|
+
* is re-checked by walking back from the maximum).
|
|
50
53
|
*
|
|
51
54
|
* @param zoned the instant to search after (exclusive)
|
|
52
|
-
* @
|
|
55
|
+
* @param until optional: the last instant to search, in epoch nanoseconds (inclusive). A caller
|
|
56
|
+
* that needs only changes up to there passes it so the search reads no further
|
|
57
|
+
* @returns the next transition, or null when there is none up to `until` or, without it, none
|
|
58
|
+
* that Temporal reports
|
|
53
59
|
*/
|
|
54
|
-
export declare function zonedNextTransition(zoned: Temporal.ZonedDateTime): Temporal.ZonedDateTime | null;
|
|
60
|
+
export declare function zonedNextTransition(zoned: Temporal.ZonedDateTime, until?: bigint): Temporal.ZonedDateTime | null;
|
|
55
61
|
/**
|
|
56
|
-
* `ZonedDateTime#getTimeZoneTransition("previous")
|
|
62
|
+
* `ZonedDateTime#getTimeZoneTransition("previous")`: TC39 `GetNamedTimeZonePreviousTransition`,
|
|
63
|
+
* the last offset change strictly before `zoned`.
|
|
57
64
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
65
|
+
* - While the D13 probe fails, a named zone is searched by GMT's own bounded search and the
|
|
66
|
+
* polyfill's search is never called (see `zonedNextTransition`).
|
|
67
|
+
* - Otherwise the polyfill answers, corrected before 1847 (defect 3): when it finds nothing in a
|
|
68
|
+
* named zone, the span from the minimum instant to its floor is checked by comparing offsets
|
|
69
|
+
* and bisecting.
|
|
60
70
|
*
|
|
61
71
|
* @param zoned the instant to search before (exclusive)
|
|
62
|
-
* @
|
|
72
|
+
* @param since optional: where the search stops, in epoch nanoseconds (exclusive). A caller that
|
|
73
|
+
* needs only changes after there passes it so the search reads no further back
|
|
74
|
+
* @returns the previous transition, or null when there is none after `since` or, without it, none
|
|
63
75
|
*/
|
|
64
|
-
export declare function zonedPreviousTransition(zoned: Temporal.ZonedDateTime): Temporal.ZonedDateTime | null;
|
|
76
|
+
export declare function zonedPreviousTransition(zoned: Temporal.ZonedDateTime, since?: bigint): Temporal.ZonedDateTime | null;
|
|
65
77
|
/**
|
|
66
78
|
* `ZonedDateTime#add`, correct at the range limits and in calendars the polyfill gets wrong.
|
|
67
79
|
*
|
|
@@ -96,6 +108,7 @@ export declare function subtractFromZoned(zoned: Temporal.ZonedDateTime, duratio
|
|
|
96
108
|
* "later"/"compatible" forward (DisambiguatePossibleEpochNanoseconds); "reject" throws for both.
|
|
97
109
|
* - The time portion is then added in exact time and is never re-resolved.
|
|
98
110
|
* - With no date portion, the whole duration is exact time and `disambiguation` never applies.
|
|
111
|
+
* - Each option is converted to a string once, as Temporal GetOption converts it.
|
|
99
112
|
*
|
|
100
113
|
* @param zoned the starting value
|
|
101
114
|
* @param duration the duration to add or subtract
|