@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
|
@@ -1,16 +1,62 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
1
2
|
/**
|
|
2
3
|
* Parse an ISO 8601 instant string to epoch nanoseconds, or `null` when it is not one.
|
|
3
4
|
*
|
|
4
|
-
* The single definition of "an instant string GMT accepts"
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* The single definition of "an instant string GMT accepts", and of the instant it names. Every
|
|
6
|
+
* GMT function that reads a moment without keeping its zone reads through here.
|
|
7
|
+
*
|
|
8
|
+
* **Which strings.** The RFC 9557 instant grammar `Temporal.Instant.from` parses, restricted to
|
|
9
|
+
* ISO 8601 extended format before the first `[` (`instantBody`: `<date>T<time>`, then `Z` or
|
|
10
|
+
* `±HH:MM[:SS[.fraction]]`), minus leap seconds (which Temporal clamps rather than rejects).
|
|
11
|
+
* Basic format, a space or lower-case `t` separator, a lower-case `z` and an hour-only time or
|
|
12
|
+
* offset are rejected. Annotations are read as Temporal reads them (proposal-temporal
|
|
9
13
|
* `ParseISODateTime`, RFC 9557 §3.3): a time zone, calendar (`[u-ca=hebrew]`) or elective
|
|
10
|
-
* (`[foo=bar]`) annotation
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
+
* (`[foo=bar]`) annotation never makes a string invalid, and an unknown critical one
|
|
15
|
+
* (`[!foo=bar]`) is rejected.
|
|
16
|
+
*
|
|
17
|
+
* **Which instant.** The written offset fixes it, as in `Temporal.Instant.from`, with one
|
|
18
|
+
* exception:
|
|
19
|
+
*
|
|
20
|
+
* - **A minute-rounded offset is read as its zone's real offset.** When the string has a
|
|
21
|
+
* bracketed zone and an offset written to the minute, and that offset is the zone's actual
|
|
22
|
+
* offset at that wall time rounded to the minute, the instant is the one the zone gives. This
|
|
23
|
+
* is TC39 `ToTemporalZonedDateTime`'s match-minutes rule (`InterpretISODateTimeOffset`),
|
|
24
|
+
* applied to the zone and the offset alone. It exists because
|
|
25
|
+
* `Temporal.ZonedDateTime.prototype.toString` writes the offset rounded to the minute: in a
|
|
26
|
+
* zone with a sub-minute offset (`Africa/Monrovia` before 1972, at −00:44:30, written
|
|
27
|
+
* `-00:45`), the string a zoned function writes would otherwise be read up to 30 seconds off.
|
|
28
|
+
* - **The instant range is the only range.** The match has no `CheckISODaysRange` on the local
|
|
29
|
+
* date, which `Temporal.ZonedDateTime.from` has, and does not need the written offset's own
|
|
30
|
+
* reading to be in range. So every string Temporal writes for an instant in range is read
|
|
31
|
+
* back, the first and last instants included: `-271821-04-19T23:58:45-00:01[Europe/London]`
|
|
32
|
+
* (London's local mean time, −00:01:15) is the first instant, although its local date is
|
|
33
|
+
* outside Temporal's date range and its reading at −00:01 is 15 seconds before the range.
|
|
34
|
+
* - **A repeated wall time inside a sub-minute offset change reads as its first pass.** The
|
|
35
|
+
* match is against each candidate instant in order, so when a wall time happened twice and
|
|
36
|
+
* the rounded offset fits the first pass, the first pass is the answer, even if the string
|
|
37
|
+
* was written for the second. This is a class of strings, not one zone: it arises wherever a
|
|
38
|
+
* zone's history has a fall-back of under a minute at a sub-minute offset. The example
|
|
39
|
+
* test262 uses: Pacific/Niue moved from −11:19:40 to −11:20:00 at the end of
|
|
40
|
+
* 15 October 1952, so 23:59:40 to 23:59:59 happened twice, 20 seconds apart, and both passes
|
|
41
|
+
* are written `-11:20`: `1952-10-15T23:59:59-11:20[Pacific/Niue]` reads as the pass at
|
|
42
|
+
* −11:19:40. This is `Temporal.ZonedDateTime.from`'s own reading (test262
|
|
43
|
+
* `intl402/Temporal/ZonedDateTime/from/zoneddatetime-sub-minute-offset.js`), and the one kind
|
|
44
|
+
* of string Temporal writes that an instant reader does not read as the instant it was
|
|
45
|
+
* written for. The exact offset, `-11:20:00`, names the second pass.
|
|
46
|
+
* - **Everything else keeps the written offset.** The complete list: a string without a
|
|
47
|
+
* bracket; a `Z` instant; an offset written with seconds, which TC39 matches exactly
|
|
48
|
+
* (`-00:45:00[Africa/Monrovia]` is −00:45:00); a bracket whose zone does not exist; and a
|
|
49
|
+
* bracket whose zone has no instant in range with that wall time at the written offset or at
|
|
50
|
+
* an offset that rounds to it (`-00:44[Africa/Monrovia]`, `-05:00[America/New_York]` in
|
|
51
|
+
* June). Such a bracket is not validated here; a function that keeps the zone
|
|
52
|
+
* (`transitTime`, `toOffsetInstant`) rejects it instead. Calendar and elective annotations
|
|
53
|
+
* never change the reading. A string whose written reading is outside the instant range, and
|
|
54
|
+
* which the zone does not bring inside it, is `null`.
|
|
55
|
+
*
|
|
56
|
+
* The zone's offset comes from Temporal's time-zone data; nothing here holds an offset or a
|
|
57
|
+
* zone name. A string in a whole-minute zone costs two offset lookups more than
|
|
58
|
+
* `Temporal.Instant.from`. Callers layer their own sentinel on top — `toNanoseconds` returns
|
|
59
|
+
* `0n`, `spanNs` returns `null` — so the parse result stays unambiguous here.
|
|
14
60
|
*
|
|
15
61
|
* @param value candidate ISO 8601 instant string
|
|
16
62
|
* @returns nanoseconds since the Unix epoch, or null when `value` is not a valid instant
|
|
@@ -21,5 +67,25 @@
|
|
|
21
67
|
* @example parseInstantNanoseconds("20240310T120000Z") // null — basic format
|
|
22
68
|
* @example parseInstantNanoseconds("2024-03-10T12:00:00z") // null — lower-case z
|
|
23
69
|
* @example parseInstantNanoseconds("1970-01-01T00:00:00Z[u-ca=hebrew]") // 0n — calendar annotation ignored
|
|
70
|
+
* @example parseInstantNanoseconds("1960-01-01T00:20:00-00:45[Africa/Monrovia]") // -315615330000000000n — 01:04:30Z: Monrovia stood at -00:44:30
|
|
71
|
+
* @example parseInstantNanoseconds("1960-01-01T00:20:00-00:45") // -315615300000000000n — 01:05:00Z: no zone, so the offset is exact
|
|
72
|
+
* @example parseInstantNanoseconds("1952-10-15T23:59:59-11:20[Pacific/Niue]") // -543069621000000000n — the first pass of a repeated second, at -11:19:40
|
|
73
|
+
* @example parseInstantNanoseconds("-271821-04-19T23:58:45-00:01[Europe/London]") // -8640000000000000000000n — the first instant, at London's -00:01:15
|
|
74
|
+
* @example parseInstantNanoseconds("2024-06-15T10:00:00Z[Not/AZone]") // 1718445600000000000n — the bracket is not validated
|
|
24
75
|
*/
|
|
25
76
|
export declare function parseInstantNanoseconds(value: string): bigint | null;
|
|
77
|
+
/**
|
|
78
|
+
* `parseInstantNanoseconds` as a `Temporal.Instant`, for callers that already hold a validated
|
|
79
|
+
* string and go on to Temporal arithmetic. Use it wherever a caller's instant string would
|
|
80
|
+
* otherwise go to `Temporal.Instant.from`, so a minute-rounded offset is read the same way
|
|
81
|
+
* everywhere. Throws where `Temporal.Instant.from` throws, so it sits inside the caller's `try`
|
|
82
|
+
* like any other Temporal parse.
|
|
83
|
+
*
|
|
84
|
+
* @param value ISO 8601 instant or zoned datetime string
|
|
85
|
+
* @returns the instant the string names
|
|
86
|
+
* @throws RangeError when `value` is not a valid instant
|
|
87
|
+
*
|
|
88
|
+
* @example instantFrom("1960-01-01T00:20:00-00:45[Africa/Monrovia]").toString() // "1960-01-01T01:04:30Z"
|
|
89
|
+
* @example instantFrom("2024-06-15T10:00:00") // throws RangeError
|
|
90
|
+
*/
|
|
91
|
+
export declare function instantFrom(value: string): Temporal.Instant;
|
|
@@ -1,19 +1,83 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { instantLeapSecond } from "../regex/leap-second.js";
|
|
3
|
-
import { hasInstantShape } from "./isoStringBody.js";
|
|
3
|
+
import { hasInstantShape, isoStringBody } from "./isoStringBody.js";
|
|
4
|
+
import { parseUtcOffsetNanoseconds } from "./utcOffsetString.js";
|
|
5
|
+
import { isValidEpoch, offsetAt, roundToMinute, utcEpochNanoseconds, } from "./zonedWallClock.js";
|
|
6
|
+
/**
|
|
7
|
+
* The first time-zone annotation in the string, as `TIME_ZONE_ANNOTATION` defines one (a
|
|
8
|
+
* bracket without `=`), with its identifier captured without the critical flag. Only a string
|
|
9
|
+
* that names a zone can have a rounded offset to resolve. The capture goes to Temporal, which
|
|
10
|
+
* decides whether it is a zone.
|
|
11
|
+
*/
|
|
12
|
+
const zoneAnnotation = /\[!?([^\]=]+)\]/;
|
|
13
|
+
const NANOSECONDS_PER_MINUTE = 60000000000n;
|
|
14
|
+
/** The most a minute-rounded offset can differ from the real one (half-expand rounding). */
|
|
15
|
+
const HALF_MINUTE = 30000000000n;
|
|
16
|
+
/** `±HH:MM`: the length of an offset written to the minute. */
|
|
17
|
+
const MINUTE_OFFSET_LENGTH = 6;
|
|
18
|
+
/**
|
|
19
|
+
* An instant body that ends in an offset written to the minute (`±HH:MM`), with no seconds
|
|
20
|
+
* part. The sign must sit directly before `HH:MM`, so `-04:56:02` does not match on its `56:02`.
|
|
21
|
+
*/
|
|
22
|
+
const minuteOffset = /[+-]\d{2}:\d{2}$/;
|
|
4
23
|
/**
|
|
5
24
|
* Parse an ISO 8601 instant string to epoch nanoseconds, or `null` when it is not one.
|
|
6
25
|
*
|
|
7
|
-
* The single definition of "an instant string GMT accepts"
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
26
|
+
* The single definition of "an instant string GMT accepts", and of the instant it names. Every
|
|
27
|
+
* GMT function that reads a moment without keeping its zone reads through here.
|
|
28
|
+
*
|
|
29
|
+
* **Which strings.** The RFC 9557 instant grammar `Temporal.Instant.from` parses, restricted to
|
|
30
|
+
* ISO 8601 extended format before the first `[` (`instantBody`: `<date>T<time>`, then `Z` or
|
|
31
|
+
* `±HH:MM[:SS[.fraction]]`), minus leap seconds (which Temporal clamps rather than rejects).
|
|
32
|
+
* Basic format, a space or lower-case `t` separator, a lower-case `z` and an hour-only time or
|
|
33
|
+
* offset are rejected. Annotations are read as Temporal reads them (proposal-temporal
|
|
12
34
|
* `ParseISODateTime`, RFC 9557 §3.3): a time zone, calendar (`[u-ca=hebrew]`) or elective
|
|
13
|
-
* (`[foo=bar]`) annotation
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
35
|
+
* (`[foo=bar]`) annotation never makes a string invalid, and an unknown critical one
|
|
36
|
+
* (`[!foo=bar]`) is rejected.
|
|
37
|
+
*
|
|
38
|
+
* **Which instant.** The written offset fixes it, as in `Temporal.Instant.from`, with one
|
|
39
|
+
* exception:
|
|
40
|
+
*
|
|
41
|
+
* - **A minute-rounded offset is read as its zone's real offset.** When the string has a
|
|
42
|
+
* bracketed zone and an offset written to the minute, and that offset is the zone's actual
|
|
43
|
+
* offset at that wall time rounded to the minute, the instant is the one the zone gives. This
|
|
44
|
+
* is TC39 `ToTemporalZonedDateTime`'s match-minutes rule (`InterpretISODateTimeOffset`),
|
|
45
|
+
* applied to the zone and the offset alone. It exists because
|
|
46
|
+
* `Temporal.ZonedDateTime.prototype.toString` writes the offset rounded to the minute: in a
|
|
47
|
+
* zone with a sub-minute offset (`Africa/Monrovia` before 1972, at −00:44:30, written
|
|
48
|
+
* `-00:45`), the string a zoned function writes would otherwise be read up to 30 seconds off.
|
|
49
|
+
* - **The instant range is the only range.** The match has no `CheckISODaysRange` on the local
|
|
50
|
+
* date, which `Temporal.ZonedDateTime.from` has, and does not need the written offset's own
|
|
51
|
+
* reading to be in range. So every string Temporal writes for an instant in range is read
|
|
52
|
+
* back, the first and last instants included: `-271821-04-19T23:58:45-00:01[Europe/London]`
|
|
53
|
+
* (London's local mean time, −00:01:15) is the first instant, although its local date is
|
|
54
|
+
* outside Temporal's date range and its reading at −00:01 is 15 seconds before the range.
|
|
55
|
+
* - **A repeated wall time inside a sub-minute offset change reads as its first pass.** The
|
|
56
|
+
* match is against each candidate instant in order, so when a wall time happened twice and
|
|
57
|
+
* the rounded offset fits the first pass, the first pass is the answer, even if the string
|
|
58
|
+
* was written for the second. This is a class of strings, not one zone: it arises wherever a
|
|
59
|
+
* zone's history has a fall-back of under a minute at a sub-minute offset. The example
|
|
60
|
+
* test262 uses: Pacific/Niue moved from −11:19:40 to −11:20:00 at the end of
|
|
61
|
+
* 15 October 1952, so 23:59:40 to 23:59:59 happened twice, 20 seconds apart, and both passes
|
|
62
|
+
* are written `-11:20`: `1952-10-15T23:59:59-11:20[Pacific/Niue]` reads as the pass at
|
|
63
|
+
* −11:19:40. This is `Temporal.ZonedDateTime.from`'s own reading (test262
|
|
64
|
+
* `intl402/Temporal/ZonedDateTime/from/zoneddatetime-sub-minute-offset.js`), and the one kind
|
|
65
|
+
* of string Temporal writes that an instant reader does not read as the instant it was
|
|
66
|
+
* written for. The exact offset, `-11:20:00`, names the second pass.
|
|
67
|
+
* - **Everything else keeps the written offset.** The complete list: a string without a
|
|
68
|
+
* bracket; a `Z` instant; an offset written with seconds, which TC39 matches exactly
|
|
69
|
+
* (`-00:45:00[Africa/Monrovia]` is −00:45:00); a bracket whose zone does not exist; and a
|
|
70
|
+
* bracket whose zone has no instant in range with that wall time at the written offset or at
|
|
71
|
+
* an offset that rounds to it (`-00:44[Africa/Monrovia]`, `-05:00[America/New_York]` in
|
|
72
|
+
* June). Such a bracket is not validated here; a function that keeps the zone
|
|
73
|
+
* (`transitTime`, `toOffsetInstant`) rejects it instead. Calendar and elective annotations
|
|
74
|
+
* never change the reading. A string whose written reading is outside the instant range, and
|
|
75
|
+
* which the zone does not bring inside it, is `null`.
|
|
76
|
+
*
|
|
77
|
+
* The zone's offset comes from Temporal's time-zone data; nothing here holds an offset or a
|
|
78
|
+
* zone name. A string in a whole-minute zone costs two offset lookups more than
|
|
79
|
+
* `Temporal.Instant.from`. Callers layer their own sentinel on top — `toNanoseconds` returns
|
|
80
|
+
* `0n`, `spanNs` returns `null` — so the parse result stays unambiguous here.
|
|
17
81
|
*
|
|
18
82
|
* @param value candidate ISO 8601 instant string
|
|
19
83
|
* @returns nanoseconds since the Unix epoch, or null when `value` is not a valid instant
|
|
@@ -24,6 +88,11 @@ import { hasInstantShape } from "./isoStringBody.js";
|
|
|
24
88
|
* @example parseInstantNanoseconds("20240310T120000Z") // null — basic format
|
|
25
89
|
* @example parseInstantNanoseconds("2024-03-10T12:00:00z") // null — lower-case z
|
|
26
90
|
* @example parseInstantNanoseconds("1970-01-01T00:00:00Z[u-ca=hebrew]") // 0n — calendar annotation ignored
|
|
91
|
+
* @example parseInstantNanoseconds("1960-01-01T00:20:00-00:45[Africa/Monrovia]") // -315615330000000000n — 01:04:30Z: Monrovia stood at -00:44:30
|
|
92
|
+
* @example parseInstantNanoseconds("1960-01-01T00:20:00-00:45") // -315615300000000000n — 01:05:00Z: no zone, so the offset is exact
|
|
93
|
+
* @example parseInstantNanoseconds("1952-10-15T23:59:59-11:20[Pacific/Niue]") // -543069621000000000n — the first pass of a repeated second, at -11:19:40
|
|
94
|
+
* @example parseInstantNanoseconds("-271821-04-19T23:58:45-00:01[Europe/London]") // -8640000000000000000000n — the first instant, at London's -00:01:15
|
|
95
|
+
* @example parseInstantNanoseconds("2024-06-15T10:00:00Z[Not/AZone]") // 1718445600000000000n — the bracket is not validated
|
|
27
96
|
*/
|
|
28
97
|
export function parseInstantNanoseconds(value) {
|
|
29
98
|
if (typeof value !== "string") {
|
|
@@ -32,10 +101,122 @@ export function parseInstantNanoseconds(value) {
|
|
|
32
101
|
if (instantLeapSecond.test(value) || !hasInstantShape(value)) {
|
|
33
102
|
return null;
|
|
34
103
|
}
|
|
104
|
+
let written;
|
|
105
|
+
try {
|
|
106
|
+
written = Temporal.Instant.from(value).epochNanoseconds;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Not an instant as written. It may still be one through its zone: see `zonedReading`.
|
|
110
|
+
written = null;
|
|
111
|
+
}
|
|
112
|
+
const body = isoStringBody(value);
|
|
113
|
+
const zone = minuteOffset.test(body)
|
|
114
|
+
? zoneAnnotation.exec(value)?.[1]
|
|
115
|
+
: undefined;
|
|
116
|
+
if (zone === undefined) {
|
|
117
|
+
return written;
|
|
118
|
+
}
|
|
35
119
|
try {
|
|
36
|
-
return
|
|
120
|
+
return written === null
|
|
121
|
+
? zonedReadingOutsideWrittenRange(value, body, zone)
|
|
122
|
+
: (zonedReading(zone, written, () => writtenOffset(body)) ?? written);
|
|
37
123
|
}
|
|
38
124
|
catch {
|
|
125
|
+
// The zone does not exist: the written offset stands.
|
|
126
|
+
return written;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** The nanoseconds of the `±HH:MM` offset that ends `body`, parsed by Temporal. */
|
|
130
|
+
function writtenOffset(body) {
|
|
131
|
+
return parseUtcOffsetNanoseconds(body.slice(-MINUTE_OFFSET_LENGTH));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* TC39 `InterpretISODateTimeOffset`'s match for a minute-precision offset, on epoch nanoseconds:
|
|
135
|
+
* the instant `zone` gives a wall time written with `offset`, or `null` when the zone has no
|
|
136
|
+
* instant in range whose offset is `offset` or rounds to it.
|
|
137
|
+
*
|
|
138
|
+
* `written` is the wall time read at the written offset. A candidate instant has the same wall
|
|
139
|
+
* time at the zone's own offset, so it lies within half a minute of `written`, and the zone's
|
|
140
|
+
* offsets half a minute either side are the only ones a candidate can have. When both are whole
|
|
141
|
+
* minutes nothing can round, the written offset is never read, and the answer is `null`: the
|
|
142
|
+
* common case costs two offset lookups. Otherwise each candidate is checked against the zone and
|
|
143
|
+
* the earliest match wins, as the spec's loop over the possible instants does. It assumes a
|
|
144
|
+
* zone changes its offset at most once in any one minute.
|
|
145
|
+
*
|
|
146
|
+
* Unlike `Temporal.ZonedDateTime.from` this has no `CheckISODaysRange` on the local date: an
|
|
147
|
+
* instant is in range or it is not, whatever date its wall clock shows.
|
|
148
|
+
*
|
|
149
|
+
* @throws RangeError when `zone` is not a time zone
|
|
150
|
+
*/
|
|
151
|
+
function zonedReading(zone, written, offset) {
|
|
152
|
+
const before = offsetAt(zone, written - HALF_MINUTE);
|
|
153
|
+
const after = offsetAt(zone, written + HALF_MINUTE);
|
|
154
|
+
if (before % NANOSECONDS_PER_MINUTE === 0n &&
|
|
155
|
+
after % NANOSECONDS_PER_MINUTE === 0n) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
const writtenOffsetNanoseconds = offset();
|
|
159
|
+
if (writtenOffsetNanoseconds === null) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
// With one offset across the whole minute a candidate needs no second look at the zone: it
|
|
163
|
+
// lies inside that minute. Across a change, each side's candidate must fall on its own side.
|
|
164
|
+
const steady = before === after;
|
|
165
|
+
let earliest = null;
|
|
166
|
+
for (const candidateOffset of steady ? [before] : [before, after]) {
|
|
167
|
+
const candidate = written + writtenOffsetNanoseconds - candidateOffset;
|
|
168
|
+
if ((candidateOffset === writtenOffsetNanoseconds ||
|
|
169
|
+
roundToMinute(candidateOffset) === writtenOffsetNanoseconds) &&
|
|
170
|
+
isValidEpoch(candidate) &&
|
|
171
|
+
(steady || offsetAt(zone, candidate) === candidateOffset) &&
|
|
172
|
+
(earliest === null || candidate < earliest)) {
|
|
173
|
+
earliest = candidate;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return earliest;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* `zonedReading` for a string `Temporal.Instant.from` refused. At the range limits the written,
|
|
180
|
+
* minute-rounded offset can put the literal reading just outside the instant range while the
|
|
181
|
+
* zone's real offset keeps the instant inside it: Europe/London at local mean time (−00:01:15)
|
|
182
|
+
* writes the first instant as `-271821-04-19T23:58:45-00:01`, 15 seconds before the range when
|
|
183
|
+
* read at −00:01. Temporal reads both halves again: the wall clock as a `PlainDateTime`, from
|
|
184
|
+
* the part before the first annotation, and the annotations on a stand-in instant, exactly as
|
|
185
|
+
* `Temporal.Instant.from` reads them (a calendar id is not checked). So every other reason the
|
|
186
|
+
* string was refused (an invalid date, an unknown critical annotation) is refused again here
|
|
187
|
+
* by the throw.
|
|
188
|
+
*
|
|
189
|
+
* @throws RangeError when the string is not a date-time, or `zone` is not a time zone
|
|
190
|
+
*/
|
|
191
|
+
function zonedReadingOutsideWrittenRange(value, body, zone) {
|
|
192
|
+
const offset = writtenOffset(body);
|
|
193
|
+
if (offset === null) {
|
|
39
194
|
return null;
|
|
40
195
|
}
|
|
196
|
+
// The annotations are read as an instant's are: on a stand-in instant, so an unknown critical
|
|
197
|
+
// annotation or a misplaced zone throws, and a calendar id is not checked.
|
|
198
|
+
Temporal.Instant.from(`1970-01-01T00:00:00Z${value.slice(body.length)}`);
|
|
199
|
+
const wall = Temporal.PlainDateTime.from(body);
|
|
200
|
+
return zonedReading(zone, utcEpochNanoseconds(wall) - offset, () => offset);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* `parseInstantNanoseconds` as a `Temporal.Instant`, for callers that already hold a validated
|
|
204
|
+
* string and go on to Temporal arithmetic. Use it wherever a caller's instant string would
|
|
205
|
+
* otherwise go to `Temporal.Instant.from`, so a minute-rounded offset is read the same way
|
|
206
|
+
* everywhere. Throws where `Temporal.Instant.from` throws, so it sits inside the caller's `try`
|
|
207
|
+
* like any other Temporal parse.
|
|
208
|
+
*
|
|
209
|
+
* @param value ISO 8601 instant or zoned datetime string
|
|
210
|
+
* @returns the instant the string names
|
|
211
|
+
* @throws RangeError when `value` is not a valid instant
|
|
212
|
+
*
|
|
213
|
+
* @example instantFrom("1960-01-01T00:20:00-00:45[Africa/Monrovia]").toString() // "1960-01-01T01:04:30Z"
|
|
214
|
+
* @example instantFrom("2024-06-15T10:00:00") // throws RangeError
|
|
215
|
+
*/
|
|
216
|
+
export function instantFrom(value) {
|
|
217
|
+
const nanoseconds = parseInstantNanoseconds(value);
|
|
218
|
+
if (nanoseconds === null) {
|
|
219
|
+
throw new RangeError("Not an ISO 8601 instant string");
|
|
220
|
+
}
|
|
221
|
+
return Temporal.Instant.fromEpochNanoseconds(nanoseconds);
|
|
41
222
|
}
|
|
@@ -34,4 +34,4 @@
|
|
|
34
34
|
* @param timeStyle Intl.DateTimeFormatOptions `timeStyle` for the time half
|
|
35
35
|
* @returns `dayLabel` joined to the localized time with the locale's own connector
|
|
36
36
|
*/
|
|
37
|
-
export declare function joinDateTimeConnector(epochMilliseconds: number, timeZone: string, locale: string | string[] | undefined, dayLabel: string, timeStyle: "short" | "medium" | "full"): string;
|
|
37
|
+
export declare function joinDateTimeConnector(epochMilliseconds: number, timeZone: string, locale: string | string[] | undefined, dayLabel: string, timeStyle: "short" | "medium" | "long" | "full"): string;
|
|
@@ -7,7 +7,8 @@ import type { Temporal } from "@js-temporal/polyfill";
|
|
|
7
7
|
* Shared by `getWeekOfMonth` (row for the date itself) and
|
|
8
8
|
* `getWeeksInMonth` (row for the month's last day, i.e. the row count).
|
|
9
9
|
* Week 1 is the row containing the 1st of the month, even when that row
|
|
10
|
-
* is a partial week
|
|
10
|
+
* is a partial week: a month grid draws every day of the month, so its
|
|
11
|
+
* first row always holds the 1st. GMT's own rule; CLDR's `minDays` plays no part.
|
|
11
12
|
*
|
|
12
13
|
* Only the weekday of the 1st is read, so callers may pass `{ dayOfWeek }` without building a
|
|
13
14
|
* date that could lie before the representable range (April 1 of -271821).
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* Shared by `getWeekOfMonth` (row for the date itself) and
|
|
7
7
|
* `getWeeksInMonth` (row for the month's last day, i.e. the row count).
|
|
8
8
|
* Week 1 is the row containing the 1st of the month, even when that row
|
|
9
|
-
* is a partial week
|
|
9
|
+
* is a partial week: a month grid draws every day of the month, so its
|
|
10
|
+
* first row always holds the 1st. GMT's own rule; CLDR's `minDays` plays no part.
|
|
10
11
|
*
|
|
11
12
|
* Only the weekday of the 1st is read, so callers may pass `{ dayOfWeek }` without building a
|
|
12
13
|
* date that could lie before the representable range (April 1 of -271821).
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Resolve the `timeZone` option of every `unix/`
|
|
2
|
+
* Resolve the `timeZone` option of every `unix/` and `utc/` function that takes one.
|
|
3
3
|
*
|
|
4
4
|
* - Omitted (`undefined`) → `"UTC"`. A Unix epoch and a UTC string name an instant, so no host
|
|
5
5
|
* zone is read unless asked for.
|
|
6
6
|
* - `"local"` → the system time zone (`getSystemTimeZone()`), or `""` when the host reports none
|
|
7
7
|
* that is valid.
|
|
8
|
-
* - A valid IANA identifier → returned as-is.
|
|
8
|
+
* - A valid IANA identifier or UTC offset (`"+05:30"`) → returned as-is.
|
|
9
9
|
* - Anything else (`null`, `""`, a typo, a non-string) → `""`, the caller's cue to return its
|
|
10
10
|
* sentinel. ECMA-402 `Intl.DateTimeFormat` and Temporal `ToTemporalTimeZoneIdentifier` throw
|
|
11
11
|
* `RangeError` for an unknown zone, so a typo never silently renders UTC.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { getSystemTimeZone } from "../zoned/get/getSystemTimeZone.js";
|
|
2
2
|
import { isValidTimeZone } from "../zoned/validate/index.js";
|
|
3
3
|
/**
|
|
4
|
-
* Resolve the `timeZone` option of every `unix/`
|
|
4
|
+
* Resolve the `timeZone` option of every `unix/` and `utc/` function that takes one.
|
|
5
5
|
*
|
|
6
6
|
* - Omitted (`undefined`) → `"UTC"`. A Unix epoch and a UTC string name an instant, so no host
|
|
7
7
|
* zone is read unless asked for.
|
|
8
8
|
* - `"local"` → the system time zone (`getSystemTimeZone()`), or `""` when the host reports none
|
|
9
9
|
* that is valid.
|
|
10
|
-
* - A valid IANA identifier → returned as-is.
|
|
10
|
+
* - A valid IANA identifier or UTC offset (`"+05:30"`) → returned as-is.
|
|
11
11
|
* - Anything else (`null`, `""`, a typo, a non-string) → `""`, the caller's cue to return its
|
|
12
12
|
* sentinel. ECMA-402 `Intl.DateTimeFormat` and Temporal `ToTemporalTimeZoneIdentifier` throw
|
|
13
13
|
* `RangeError` for an unknown zone, so a typo never silently renders UTC.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { Disambiguation } from "../types/index.js";
|
|
2
|
+
import { type IntervalNanoseconds } from "./intervalNanoseconds.js";
|
|
3
|
+
/** A `LocalWindow` validated once: canonical PlainTime strings, and whether it wraps midnight. */
|
|
4
|
+
export type ResolvedWindow = {
|
|
5
|
+
from: string;
|
|
6
|
+
to: string;
|
|
7
|
+
wraps: boolean;
|
|
8
|
+
};
|
|
9
|
+
/** An `OperatingSchedule` reduced to the lookups the day walk needs. */
|
|
10
|
+
export type ResolvedSchedule = {
|
|
11
|
+
timeZone: string;
|
|
12
|
+
/** Windows by ISO weekday; index 0 is unused. */
|
|
13
|
+
weekly: readonly (readonly ResolvedWindow[])[];
|
|
14
|
+
holidays: ReadonlySet<string>;
|
|
15
|
+
overrides: ReadonlyMap<string, readonly ResolvedWindow[]>;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Local dates a range may span, counted from the date its start falls on: about 27 years, the
|
|
19
|
+
* same bound `bucketRange` puts on a day walk. A walk that runs out answers with the sentinel,
|
|
20
|
+
* never a partial list.
|
|
21
|
+
*/
|
|
22
|
+
export declare const MAX_SCHEDULE_DAYS = 10000;
|
|
23
|
+
/**
|
|
24
|
+
* The search horizon of `nextOpenAt`, `nextCloseAt` and `addOperatingTime` when the caller
|
|
25
|
+
* gives no `within`: one calendar year in the schedule's zone.
|
|
26
|
+
*/
|
|
27
|
+
export declare const DEFAULT_OPERATING_HORIZON = "P1Y";
|
|
28
|
+
/**
|
|
29
|
+
* Parse `OperatingSchedule['weekly']`: an object whose own keys are ISO weekdays `"1"`–`"7"`,
|
|
30
|
+
* each holding an array of `LocalWindow`s (or `undefined`, meaning closed). Any other key, or a
|
|
31
|
+
* malformed window, returns `null`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseWeeklyPattern(value: unknown): ResolvedWindow[][] | null;
|
|
34
|
+
/** Validate an `OperatingSchedule`, or `null` when any part of it is malformed. */
|
|
35
|
+
export declare function parseOperatingSchedule(value: unknown): ResolvedSchedule | null;
|
|
36
|
+
/**
|
|
37
|
+
* Read `disambiguation` from an options argument. Omitted means `"compatible"`, as in
|
|
38
|
+
* `resolveLocal`; anything but the four Temporal values, or an options argument that is not an
|
|
39
|
+
* object, returns `null`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function parseScheduleDisambiguation(options: unknown): Disambiguation | null;
|
|
42
|
+
/**
|
|
43
|
+
* The last instant a search may answer with: `from` plus `within` (default one year), added in
|
|
44
|
+
* the schedule's zone so `P1D` is one local day. It is clamped to the search cap: the last instant
|
|
45
|
+
* before the local date `MAX_SCHEDULE_DAYS + 1` after the one `from` falls on, so a search answers
|
|
46
|
+
* anywhere on the 10,000th date and nowhere after it. A horizon past Temporal's last instant is
|
|
47
|
+
* that instant, since nothing after it can be answered. `null` when `within` is not a
|
|
48
|
+
* non-negative ISO duration.
|
|
49
|
+
*/
|
|
50
|
+
export declare function parseSearchHorizon(fromNs: bigint, within: unknown, timeZone: string): bigint | null;
|
|
51
|
+
/**
|
|
52
|
+
* What the walk tells its caller.
|
|
53
|
+
*
|
|
54
|
+
* - `run` is a finished open run: sorted, disjoint, non-touching and never extended later.
|
|
55
|
+
* - `day` announces that every window still to come starts at or after `bound`, and passes the
|
|
56
|
+
* runs still `pending`: sorted and disjoint, each ending at or after `bound`, so a later window
|
|
57
|
+
* may extend them but cannot add open time before `bound`. A caller can answer from them once
|
|
58
|
+
* its answer lies at or before `bound`.
|
|
59
|
+
* - Returning `true` from either stops the walk; stopping from `day` hands the pending runs to
|
|
60
|
+
* `run` first.
|
|
61
|
+
*/
|
|
62
|
+
export type ScheduleVisitor = {
|
|
63
|
+
run: (run: IntervalNanoseconds) => boolean;
|
|
64
|
+
day: (bound: bigint, pending: readonly IntervalNanoseconds[]) => boolean;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* How a walk ended. `unresolvedStart` is the earliest instant a window rejected under
|
|
68
|
+
* `"reject"` could open at, among those that could still be open at or after `fromNs`;
|
|
69
|
+
* `undefined` when there is none. A rejected window on a date the walk did not reach starts at
|
|
70
|
+
* or after the last `bound` it announced.
|
|
71
|
+
*/
|
|
72
|
+
export type ScheduleWalk = {
|
|
73
|
+
unresolvedStart: bigint | undefined;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Walk the schedule's local dates from a little before `fromNs`, handing the visitor each open
|
|
77
|
+
* run as soon as no later window can extend it.
|
|
78
|
+
*
|
|
79
|
+
* - Dates come from the day buckets `floorToZone` and `bucketRange` use, so a deleted date
|
|
80
|
+
* (`Pacific/Apia`, 2011-12-30) is never visited, and a date the clock re-enters after a
|
|
81
|
+
* fall-back (`America/Goose_Bay`, 2010-11-06) is visited once.
|
|
82
|
+
* - A window can start as early as the previous date's first instant (see `resolveDateWindows`),
|
|
83
|
+
* so the walk settles one date behind: once a date is resolved, the first instant of the date
|
|
84
|
+
* resolved before it is the `bound` no later window starts before.
|
|
85
|
+
* - When the visitor stops the walk from `day`, or the last representable day is reached, the
|
|
86
|
+
* runs still pending are handed over too.
|
|
87
|
+
* - Returns `null` when a day bucket could not be found, or the walk would resolve a date
|
|
88
|
+
* `MAX_SCHEDULE_DAYS + 2` after the one `fromNs` falls on. Neither use reaches that: a range
|
|
89
|
+
* is refused up front past `MAX_SCHEDULE_DAYS` dates, and a search's horizon ends with the
|
|
90
|
+
* `MAX_SCHEDULE_DAYS`th date, so its walk stops by the horizon one date later.
|
|
91
|
+
*/
|
|
92
|
+
export declare function walkSchedule(schedule: ResolvedSchedule, fromNs: bigint, disambiguation: Disambiguation, visitor: ScheduleVisitor): ScheduleWalk | null;
|
|
93
|
+
/**
|
|
94
|
+
* The schedule's open runs clipped to `[startNs, endNs)`, in the range's own strings where a run
|
|
95
|
+
* is clipped. `null` when the walk fails (see `walkSchedule`), or when a window rejected under
|
|
96
|
+
* `"reject"` reaches into the range.
|
|
97
|
+
*/
|
|
98
|
+
export declare function scheduleRunsWithin(schedule: ResolvedSchedule, range: IntervalNanoseconds, disambiguation: Disambiguation): IntervalNanoseconds[] | null;
|
|
99
|
+
/**
|
|
100
|
+
* The first instant at or after `fromNs` that the schedule is open: `fromNs` itself inside an
|
|
101
|
+
* open run, else the start of the next run. Answered as soon as no later window can open
|
|
102
|
+
* sooner, without waiting for the run to close. `undefined` when none falls at or before
|
|
103
|
+
* `horizonNs`, `null` when the walk fails or a window rejected under `"reject"` could open
|
|
104
|
+
* sooner.
|
|
105
|
+
*/
|
|
106
|
+
export declare function firstOpenInstant(schedule: ResolvedSchedule, fromNs: bigint, horizonNs: bigint, disambiguation: Disambiguation): bigint | undefined | null;
|
|
107
|
+
/**
|
|
108
|
+
* The first instant at or after `fromNs` that the schedule is closed: `fromNs` itself outside
|
|
109
|
+
* every open run, else the end of the run holding it. A closed `fromNs` is answered as soon as
|
|
110
|
+
* no later window can cover it. `undefined` when the answer falls after `horizonNs`, `null` when
|
|
111
|
+
* the walk fails or a window rejected under `"reject"` could keep the schedule open past it.
|
|
112
|
+
*/
|
|
113
|
+
export declare function firstClosedInstant(schedule: ResolvedSchedule, fromNs: bigint, horizonNs: bigint, disambiguation: Disambiguation): bigint | undefined | null;
|
|
114
|
+
/**
|
|
115
|
+
* The instant at which `amountNs` of open time has elapsed since `fromNs`: the earliest `X`
|
|
116
|
+
* with exactly that much open time in `[fromNs, X)`. `fromNs` itself when `amountNs` is zero.
|
|
117
|
+
* Answered as soon as no later window can add open time before `X`. `undefined` when `X` falls
|
|
118
|
+
* after `horizonNs`, `null` when the walk fails or a window rejected under `"reject"` could add
|
|
119
|
+
* open time before `X`.
|
|
120
|
+
*/
|
|
121
|
+
export declare function instantAfterOpenTime(schedule: ResolvedSchedule, fromNs: bigint, amountNs: bigint, horizonNs: bigint, disambiguation: Disambiguation): bigint | undefined | null;
|
|
122
|
+
/**
|
|
123
|
+
* An amount of open time in nanoseconds, from an ISO duration of hours and smaller units.
|
|
124
|
+
* `null` for a negative duration, for any calendar unit (years, months, weeks or days — `P1D`
|
|
125
|
+
* could mean 24 open hours or one working day, so it is not guessed), or invalid input.
|
|
126
|
+
*/
|
|
127
|
+
export declare function parseOpenTimeAmount(value: unknown): bigint | null;
|
|
128
|
+
/** Epoch nanoseconds as a UTC instant string ending in `Z`. */
|
|
129
|
+
export declare function instantText(nanoseconds: bigint): string;
|