@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,300 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { TIME_ZONE_ANNOTATION, exactDurationNanoseconds, isOptionsArgument, isoStringBody, zonedDateTimeFrom, } from "../../internal/index.js";
|
|
3
|
+
import { isValidDateTime } from "../../plain/validate/isValidDateTime.js";
|
|
4
|
+
import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
5
|
+
import { isValidTimeZone } from "../../zoned/validate/isValidTimeZone.js";
|
|
6
|
+
import { isValidZonedDateTime } from "../../zoned/validate/isValidZonedDateTime.js";
|
|
7
|
+
import { etaAtZone } from "../convert/etaAtZone.js";
|
|
8
|
+
import { transitTime } from "./transitTime.js";
|
|
9
|
+
import { optionOrDefault } from "../../internal/optionOrDefault.js";
|
|
10
|
+
/**
|
|
11
|
+
* A time-zone annotation anywhere in the string (`TIME_ZONE_ANNOTATION`): a bracket without
|
|
12
|
+
* `=`. A departure that names a zone must name a real one that agrees with its offset.
|
|
13
|
+
*/
|
|
14
|
+
const zoneAnnotation = new RegExp(TIME_ZONE_ANNOTATION);
|
|
15
|
+
/**
|
|
16
|
+
* A departure resolved to the exact instant it names, or `null`.
|
|
17
|
+
*
|
|
18
|
+
* An instant (`Z`/offset) is already exact; a zoned string is exact through its bracket, which
|
|
19
|
+
* is read and must be real and agree with its offset (unlike `crossingTime`, which never reads
|
|
20
|
+
* one). A zoneless wall time is a published local schedule time, exact only through
|
|
21
|
+
* `wallTimeZone` — the caller decides which zone that is: `startTimeZone` for the first leg,
|
|
22
|
+
* the previous leg's `timeZone` for any other leg (see `legDeparture`). Without one, a
|
|
23
|
+
* zoneless departure is not a moment. `cursor` picks the pass of a repeated hour (see
|
|
24
|
+
* `wallTimeInstant`).
|
|
25
|
+
*/
|
|
26
|
+
function departureInstant(departure, wallTimeZone, cursor) {
|
|
27
|
+
if (typeof departure !== "string") {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
if (isValidZonedDateTime(departure)) {
|
|
31
|
+
return wallTimeInstant(departure, cursor);
|
|
32
|
+
}
|
|
33
|
+
if (zoneAnnotation.test(departure)) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (isValidInstant(departure)) {
|
|
37
|
+
return Temporal.Instant.from(departure);
|
|
38
|
+
}
|
|
39
|
+
if (wallTimeZone !== undefined && isValidDateTime(departure)) {
|
|
40
|
+
// resolveLocal's core: the zone the schedule's wall time is exact in.
|
|
41
|
+
return wallTimeInstant(`${isoStringBody(departure)}[${wallTimeZone}]`, cursor);
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The instant a zoned string names. On a later leg (`cursor` set), a wall time the clock showed
|
|
47
|
+
* twice — a fall-back hour — resolves to the earliest pass at or after `cursor`, the first
|
|
48
|
+
* moment the cargo can leave: a printed hub time never says which pass it means, and the one a
|
|
49
|
+
* shipper would catch is the first the cargo is ready for. Otherwise, and when neither pass is
|
|
50
|
+
* at or after `cursor` (a real miss), it resolves `"compatible"`: the earlier pass of a
|
|
51
|
+
* repeated hour, the later instant of a skipped one. A written offset names one pass, so both
|
|
52
|
+
* reads agree and it always wins. A repeated hour is told apart from a skipped one by whether
|
|
53
|
+
* both passes keep the wall time asked for.
|
|
54
|
+
*/
|
|
55
|
+
function wallTimeInstant(zoned, cursor) {
|
|
56
|
+
if (cursor !== null) {
|
|
57
|
+
const earlier = zonedDateTimeFrom(zoned, { disambiguation: "earlier" });
|
|
58
|
+
const later = zonedDateTimeFrom(zoned, { disambiguation: "later" });
|
|
59
|
+
const repeated = !earlier.toInstant().equals(later.toInstant()) &&
|
|
60
|
+
earlier.toPlainDateTime().equals(later.toPlainDateTime());
|
|
61
|
+
if (repeated) {
|
|
62
|
+
for (const pass of [earlier.toInstant(), later.toInstant()]) {
|
|
63
|
+
if (Temporal.Instant.compare(pass, cursor) >= 0) {
|
|
64
|
+
return pass;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return zonedDateTimeFrom(zoned, { disambiguation: "compatible" }).toInstant();
|
|
70
|
+
}
|
|
71
|
+
/** The three opaque tag keys of a leg, echoed onto its LegTime. */
|
|
72
|
+
const TAG_KEYS = ["mode", "origin", "destination"];
|
|
73
|
+
/**
|
|
74
|
+
* The leg's tags, ready to spread onto its LegTime — an unsupplied key stays truly absent —
|
|
75
|
+
* or `null` when a present tag is not a string.
|
|
76
|
+
*/
|
|
77
|
+
function legTags(leg) {
|
|
78
|
+
const tags = {};
|
|
79
|
+
for (const key of TAG_KEYS) {
|
|
80
|
+
const tag = leg[key];
|
|
81
|
+
if (tag === undefined) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (typeof tag !== "string") {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
tags[key] = tag;
|
|
88
|
+
}
|
|
89
|
+
return tags;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The instant this leg leaves: its scheduled `departure`, or the connection cursor (the previous
|
|
93
|
+
* arrival plus its dwell) it chains from. A zoneless `departure` is read as a wall time in
|
|
94
|
+
* `startTimeZone` on the first leg (`cursor === null`), or in `previousTimeZone` — the previous
|
|
95
|
+
* leg's own `timeZone`, already proven real by that leg's `legBoundaries` call — on any other
|
|
96
|
+
* leg; `previousTimeZone` is `undefined`, and ignored, on the first leg. A scheduled departure
|
|
97
|
+
* before the cursor — inside the previous handoff's minimum connect time, or before the arrival
|
|
98
|
+
* itself — is a missed connection, invalid input rather than a negative wait; equal passes, a
|
|
99
|
+
* zero-slack connection is feasible. `null` on the first leg (no cursor) means the leg's
|
|
100
|
+
* departure did not resolve.
|
|
101
|
+
*/
|
|
102
|
+
function legDeparture(leg, cursor, startTimeZone, previousTimeZone) {
|
|
103
|
+
if (cursor !== null && leg.departure === undefined) {
|
|
104
|
+
return cursor;
|
|
105
|
+
}
|
|
106
|
+
const wallTimeZone = cursor === null ? startTimeZone : previousTimeZone;
|
|
107
|
+
const departure = departureInstant(leg.departure, wallTimeZone, cursor);
|
|
108
|
+
if (departure === null) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
if (cursor !== null && Temporal.Instant.compare(departure, cursor) < 0) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return departure;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Whether a final leg's `dwellAfter` is a dwell `transitTime` would accept — an ISO 8601
|
|
118
|
+
* duration with no years, months or weeks — and is not negative. Checked on the duration alone:
|
|
119
|
+
* the last dwell moves nothing, so no instant is computed and the range cannot reject it.
|
|
120
|
+
*/
|
|
121
|
+
function isValidFinalDwell(dwellAfter) {
|
|
122
|
+
const nanoseconds = exactDurationNanoseconds(dwellAfter);
|
|
123
|
+
return nanoseconds !== null && nanoseconds >= 0n;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* A leg's arrival, its local rendering, and the dwell hop to when the next leg may leave.
|
|
127
|
+
*
|
|
128
|
+
* `transitTime` gives both the leg and the hop the duration grammar (calendar units refused, a
|
|
129
|
+
* day is 24 hours). A leg that lands before it departs, or a hop that lands before its own
|
|
130
|
+
* arrival, is negative time — a data error. The final leg's hop is not taken (`released` is
|
|
131
|
+
* `null`): its dwell is validated as a duration and echoed, never turned into an instant.
|
|
132
|
+
*/
|
|
133
|
+
function legBoundaries(departure, leg, isFinal) {
|
|
134
|
+
const arrival = transitTime(departure.toString(), leg.duration);
|
|
135
|
+
if (arrival === "") {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const arrivalInstant = Temporal.Instant.from(arrival);
|
|
139
|
+
if (Temporal.Instant.compare(arrivalInstant, departure) < 0) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const localArrival = etaAtZone(arrival, leg.timeZone);
|
|
143
|
+
if (localArrival === "") {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
const dwellAfter = optionOrDefault(leg.dwellAfter, "PT0S");
|
|
147
|
+
if (isFinal) {
|
|
148
|
+
return isValidFinalDwell(dwellAfter)
|
|
149
|
+
? { arrival, localArrival, dwellAfter, released: null }
|
|
150
|
+
: null;
|
|
151
|
+
}
|
|
152
|
+
const releasedString = transitTime(arrival, dwellAfter);
|
|
153
|
+
if (releasedString === "") {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
const released = Temporal.Instant.from(releasedString);
|
|
157
|
+
if (Temporal.Instant.compare(released, arrivalInstant) < 0) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return { arrival, localArrival, dwellAfter, released };
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Chain the legs: each leg leaves at its scheduled departure or at the cursor the previous leg
|
|
164
|
+
* released, and lands as `legBoundaries` computes. `previousTimeZone` carries leg N-1's own
|
|
165
|
+
* `timeZone` forward so leg N's zoneless departure can be read in it; it stays `undefined`
|
|
166
|
+
* before leg 0 (where `startTimeZone` applies instead, never this) and is captured only once
|
|
167
|
+
* `legBoundaries` has proven that zone real, never speculatively. `null` when any leg is
|
|
168
|
+
* malformed, misses its connection, or leaves the instant range.
|
|
169
|
+
*/
|
|
170
|
+
function chainLegs(legs, startTimeZone) {
|
|
171
|
+
const legTimes = [];
|
|
172
|
+
let cursor = null;
|
|
173
|
+
let previousTimeZone;
|
|
174
|
+
for (const [index, leg] of legs.entries()) {
|
|
175
|
+
if (typeof leg !== "object" || leg === null) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const tags = legTags(leg);
|
|
179
|
+
if (tags === null) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
const departure = legDeparture(leg, cursor, startTimeZone, previousTimeZone);
|
|
183
|
+
if (departure === null) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const boundaries = legBoundaries(departure, leg, index === legs.length - 1);
|
|
187
|
+
if (boundaries === null) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
cursor = boundaries.released;
|
|
191
|
+
previousTimeZone = leg.timeZone;
|
|
192
|
+
legTimes.push({
|
|
193
|
+
arrival: boundaries.arrival,
|
|
194
|
+
localArrival: boundaries.localArrival,
|
|
195
|
+
dwellAfter: boundaries.dwellAfter,
|
|
196
|
+
...tags,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
return legTimes;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Chain the legs of a multi-modal move into an end-to-end ETA with zone-local times at every
|
|
203
|
+
* handoff.
|
|
204
|
+
*
|
|
205
|
+
* A truck→ship→rail move is published as one departure plus a duration per leg, and the hour
|
|
206
|
+
* naive implementations lose lives at the handoffs: every leg boundary here is an exact
|
|
207
|
+
* instant, and local rendering happens only at the edges, via `etaAtZone`.
|
|
208
|
+
*
|
|
209
|
+
* - **Each leg's arrival plus its `dwellAfter` is the next leg's departure** unless the next leg
|
|
210
|
+
* carries an explicit `departure` — a scheduled connection the cargo waits for. `dwellAfter`
|
|
211
|
+
* is the handling time at the handoff, the minimum connect time: a scheduled departure
|
|
212
|
+
* earlier than the previous arrival plus its dwell is a missed connection and returns `null`
|
|
213
|
+
* (equal passes — a zero-slack connection is feasible). It follows `transitTime`'s duration
|
|
214
|
+
* grammar, may not be negative, and is echoed on the `LegTime` exactly as written (`"PT90M"`
|
|
215
|
+
* stays `"PT90M"`), `"PT0S"` when omitted. The last leg's dwell moves nothing — there is no
|
|
216
|
+
* leg after it — so it is validated as a duration (no years, months or weeks, not negative)
|
|
217
|
+
* and echoed, but never added to an instant: it cannot turn a representable ETA into `null`.
|
|
218
|
+
* - **`departure` must be exact:** an instant (`Z`/offset) or a zoned string, whose bracketed
|
|
219
|
+
* zone is read and must be real and agree with its offset. The first leg requires one.
|
|
220
|
+
* - **`startTimeZone` resolves the first leg alone:** schedules are published as zone-local wall
|
|
221
|
+
* times, so a zoneless first-leg departure is read in `startTimeZone`. Zoneless without the
|
|
222
|
+
* option is `null`; the option is ignored when the departure is already exact; an invalid
|
|
223
|
+
* `startTimeZone` is `null` even when unused; it is never applied to a later leg — see the next
|
|
224
|
+
* rule for those.
|
|
225
|
+
* - **A later leg's zoneless departure is read in the previous leg's `timeZone`:** a real
|
|
226
|
+
* timetable publishes a local wall time at every hub, not just at origin, and leg N−1's
|
|
227
|
+
* `timeZone` is exactly leg N's departure zone. So a zoneless departure on any leg but the
|
|
228
|
+
* first is read there, with the same `"compatible"` disambiguation as `startTimeZone`. This is
|
|
229
|
+
* a separate, always-on mechanism — `startTimeZone` still names only the first leg's zone and
|
|
230
|
+
* cannot be used for a later one. The missed-connection check still runs after resolution, so a
|
|
231
|
+
* later zoneless departure that resolves earlier than the cursor is still `null`.
|
|
232
|
+
* - **Local-time resolution policy (`"compatible"`).** A zoned departure written without an
|
|
233
|
+
* offset (`"2024-11-03T01:30:00[America/New_York]"`), a zoneless first departure read in
|
|
234
|
+
* `startTimeZone`, and a zoneless later-leg departure read in the previous leg's `timeZone`
|
|
235
|
+
* are all wall times. An **ambiguous** wall time — a fall-back hour the clock ran through
|
|
236
|
+
* twice — resolves to the **earlier** instant; a **nonexistent** one — a spring-forward hour
|
|
237
|
+
* the clock skipped — resolves to the **later** instant. Write the offset to pick the other
|
|
238
|
+
* pass of a repeated hour.
|
|
239
|
+
* - **A repeated hour at a hub takes the pass the cargo can catch.** On any leg but the first, an
|
|
240
|
+
* ambiguous wall time resolves to the earliest pass at or after the previous arrival plus its
|
|
241
|
+
* dwell — a printed timetable never says which pass it means. When neither pass is that late,
|
|
242
|
+
* it resolves to the earlier pass as above, and the connection is missed. A skipped hour, and
|
|
243
|
+
* the first leg, which has no arrival to wait for, keep the rule above.
|
|
244
|
+
* - `duration` follows `transitTime`: time units are elapsed time, a day is exactly 24 hours,
|
|
245
|
+
* and calendar units (years, months, weeks) return `null`. `transitTime` accepts a negative
|
|
246
|
+
* duration (to recover a departure from an arrival), but a leg cannot arrive before it
|
|
247
|
+
* departs, so a negative leg is invalid input here and returns `null` (`-PT0S` is zero).
|
|
248
|
+
* - `mode`, `origin` and `destination` are opaque string tags echoed onto each `LegTime` and
|
|
249
|
+
* absent when not supplied; GMT does not resolve them to zones — `timeZone` is the caller's
|
|
250
|
+
* fact.
|
|
251
|
+
* - `eta` is the last leg's `localArrival`, so a single-leg schedule is exactly `transitTime`
|
|
252
|
+
* composed with `etaAtZone`.
|
|
253
|
+
* - An empty legs array is valid vacuous input and returns `{ eta: "", legTimes: [] }`;
|
|
254
|
+
* malformed input (a non-array, a non-object leg, an invalid field) returns `null`.
|
|
255
|
+
* - Returns `null` on invalid input.
|
|
256
|
+
*
|
|
257
|
+
* @param legs the journey's legs, in travel order
|
|
258
|
+
* @param options The zone a zoneless first-leg departure is read in
|
|
259
|
+
* @returns the final local ETA and each leg's arrival, local arrival and dwell, or null on invalid input
|
|
260
|
+
*
|
|
261
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "PT36H", timeZone: "Asia/Tokyo" }]) // { eta: "2024-06-17T07:00:00+09:00[Asia/Tokyo]", legTimes: [{ arrival: "2024-06-16T22:00:00Z", localArrival: "2024-06-17T07:00:00+09:00[Asia/Tokyo]", dwellAfter: "PT0S" }] }
|
|
262
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T00:00:00Z", duration: "PT10H", timeZone: "UTC", dwellAfter: "PT2H" }, { duration: "PT5H", timeZone: "Asia/Tokyo" }]) // { eta: "2024-06-16T02:00:00+09:00[Asia/Tokyo]", legTimes: [{ arrival: "2024-06-15T10:00:00Z", localArrival: "2024-06-15T10:00:00+00:00[UTC]", dwellAfter: "PT2H" }, { arrival: "2024-06-15T17:00:00Z", localArrival: "2024-06-16T02:00:00+09:00[Asia/Tokyo]", dwellAfter: "PT0S" }] } (the second leg leaves at 12:00Z, after the dwell)
|
|
263
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "PT1H", timeZone: "UTC", mode: "ship" }]) // { eta: "2024-06-15T11:00:00+00:00[UTC]", legTimes: [{ arrival: "2024-06-15T11:00:00Z", localArrival: "2024-06-15T11:00:00+00:00[UTC]", dwellAfter: "PT0S", mode: "ship" }] } (tags echo back; unsupplied tag keys stay absent)
|
|
264
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T10:00:00", duration: "PT1H", timeZone: "UTC" }], { startTimeZone: "America/New_York" }) // { eta: "2024-06-15T15:00:00+00:00[UTC]", legTimes: [{ arrival: "2024-06-15T15:00:00Z", localArrival: "2024-06-15T15:00:00+00:00[UTC]", dwellAfter: "PT0S" }] } (a published 10:00 wall time, read in New York)
|
|
265
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T00:00:00Z", duration: "PT10H", timeZone: "UTC", dwellAfter: "PT2H" }, { departure: "2024-06-15T13:00:00", duration: "PT1H", timeZone: "UTC" }]) // { eta: "2024-06-15T14:00:00+00:00[UTC]", legTimes: [{ arrival: "2024-06-15T10:00:00Z", localArrival: "2024-06-15T10:00:00+00:00[UTC]", dwellAfter: "PT2H" }, { arrival: "2024-06-15T14:00:00Z", localArrival: "2024-06-15T14:00:00+00:00[UTC]", dwellAfter: "PT0S" }] } (leg 2's zoneless 13:00 is read in leg 1's UTC destination zone, not startTimeZone, since none was supplied)
|
|
266
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T00:00:00Z", duration: "PT10H", timeZone: "UTC", dwellAfter: "PT2H" }, { departure: "2024-06-15T11:00:00", duration: "PT1H", timeZone: "UTC" }]) // null (leg 2's zoneless 11:00, read in UTC, falls inside leg 1's dwell: a missed connection)
|
|
267
|
+
* @example scheduleDelivery([]) // { eta: "", legTimes: [] }
|
|
268
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T00:00:00Z", duration: "PT10H", timeZone: "UTC", dwellAfter: "PT2H" }, { departure: "2024-06-15T11:00:00Z", duration: "PT1H", timeZone: "UTC" }]) // null (the scheduled connection leaves inside the dwell: a missed connection)
|
|
269
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T10:00:00", duration: "PT1H", timeZone: "UTC" }]) // null (a zoneless departure without startTimeZone is not a moment)
|
|
270
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "-PT1H", timeZone: "UTC" }]) // null (a leg cannot arrive before it departs)
|
|
271
|
+
* @example scheduleDelivery([{ duration: "PT1H", timeZone: "UTC" }]) // null (the first leg needs a departure)
|
|
272
|
+
* @example scheduleDelivery([{ departure: "2024-06-15T10:00:00Z", duration: "P1M", timeZone: "UTC" }]) // null (calendar units need a reference point)
|
|
273
|
+
* @example scheduleDelivery("legs") // null
|
|
274
|
+
*/
|
|
275
|
+
export function scheduleDelivery(legs, options) {
|
|
276
|
+
try {
|
|
277
|
+
if (!isOptionsArgument(options)) {
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
const startTimeZone = options?.startTimeZone;
|
|
281
|
+
if (startTimeZone !== undefined && !isValidTimeZone(startTimeZone)) {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
if (!Array.isArray(legs)) {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
const legTimes = chainLegs(legs, startTimeZone);
|
|
288
|
+
if (legTimes === null) {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
// An empty legs array is the vacuous schedule: eta is "" only there.
|
|
292
|
+
const last = legTimes.at(-1);
|
|
293
|
+
return { eta: last === undefined ? "" : last.localArrival, legTimes };
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// Never throws (Core Rule 3): a hostile
|
|
297
|
+
// argument is invalid input, not an exception.
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
@@ -14,15 +14,30 @@
|
|
|
14
14
|
* suggest, because that is when the vessel, train or aircraft actually gets there.
|
|
15
15
|
* - **Calendar units are refused.** A `duration` with years, months or weeks returns `""`: no
|
|
16
16
|
* leg takes "a month" in a sense that time arithmetic can fix without a reference point, and
|
|
17
|
-
* Temporal
|
|
18
|
-
* than timed belong to `scheduleDelivery`.
|
|
17
|
+
* Temporal's `round` and `total` require a `relativeTo` for them. Scheduled connections that
|
|
18
|
+
* are dated rather than timed belong to `scheduleDelivery`.
|
|
19
19
|
* - **The departure's zone is preserved.** A bracketed IANA zone (`…-05:00[America/New_York]`)
|
|
20
20
|
* stays that zone, so the arrival's offset is whatever is in force there at arrival. A `Z`
|
|
21
21
|
* instant returns a `Z` instant; an offset-only instant keeps its offset, written exactly as
|
|
22
22
|
* the departure wrote it, sub-minute offsets such as `+05:30:15` included (an offset is not a
|
|
23
23
|
* zone, so nothing else can be inferred from it — see `toOffsetInstant`). A bracketed zone
|
|
24
24
|
* that does not exist, or that contradicts its offset, is rejected as `isValidZonedDateTime`
|
|
25
|
-
* rejects it; it does not fall back to the offset.
|
|
25
|
+
* rejects it; it does not fall back to the offset. An offset written to the minute that is the
|
|
26
|
+
* zone's sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) agrees with the
|
|
27
|
+
* zone, as Temporal writes and reads it, and names the instant the zone gives.
|
|
28
|
+
* - **One zoned departure in range is refused.** A zoned departure is read as
|
|
29
|
+
* `Temporal.ZonedDateTime.from` reads it, which rejects a local date of −271821-04-19. A zone
|
|
30
|
+
* west of Greenwich shows that date for the first hours of the instant range, so a departure
|
|
31
|
+
* written there (`-271821-04-19T23:59:00-00:01[Europe/London]`) returns `""`, although
|
|
32
|
+
* `etaAtZone` writes it and `scheduleDeviation` reads it. Pass the instant in `Z` form.
|
|
33
|
+
* - **Local-time resolution policy (`"compatible"`).** A departure written as a wall time with a
|
|
34
|
+
* bracketed zone and no offset is resolved in that zone with the `"compatible"` policy,
|
|
35
|
+
* Temporal's default and `resolveLocal`'s. An **ambiguous** wall time — a fall-back hour the
|
|
36
|
+
* clock ran through twice — resolves to the **earlier** instant:
|
|
37
|
+
* `2024-11-03T01:30:00[America/New_York]` is `01:30-04:00`. A **nonexistent** one — a
|
|
38
|
+
* spring-forward hour the clock skipped — resolves to the **later** instant:
|
|
39
|
+
* `2024-03-10T02:30:00[America/New_York]` is `03:30-04:00`. Write the offset to name the other
|
|
40
|
+
* pass of a repeated hour; a departure that carries its offset is never re-resolved.
|
|
26
41
|
* - RFC 9557 annotations are read as `Temporal.Instant.from` reads them: a bracket without `=`
|
|
27
42
|
* is a time zone, and a `key=value` bracket with an unknown key is ignored when elective and
|
|
28
43
|
* rejected when critical (`[!…]`). A calendar on a departure without a zone is accepted and
|
|
@@ -45,8 +60,11 @@
|
|
|
45
60
|
* @example transitTime("2024-06-15T10:00:00+05:30:15", "PT1H") // "2024-06-15T11:00:00+05:30:15" (a sub-minute offset is kept as written)
|
|
46
61
|
* @example transitTime("2024-06-15T10:00:00Z[foo=bar]", "PT1H") // "2024-06-15T11:00:00Z" (an elective unknown annotation is ignored)
|
|
47
62
|
* @example transitTime("2024-06-15T12:30:00-04:00[America/New_York]", "-PT2H30M") // "2024-06-15T10:00:00-04:00[America/New_York]"
|
|
63
|
+
* @example transitTime("2024-11-03T01:30:00[America/New_York]", "PT0S") // "2024-11-03T01:30:00-04:00[America/New_York]" (an ambiguous wall time resolves to the earlier instant)
|
|
64
|
+
* @example transitTime("2024-03-10T02:30:00[America/New_York]", "PT0S") // "2024-03-10T03:30:00-04:00[America/New_York]" (a nonexistent wall time resolves to the later instant)
|
|
48
65
|
* @example transitTime("2024-06-15T10:00:00-04:00[America/New_York]", "P1M") // "" (calendar units need a reference point)
|
|
49
66
|
* @example transitTime("2024-06-15T10:00:00-05:00[America/New_York]", "PT2H") // "" (New York is -04:00 in June: the offset contradicts the zone)
|
|
67
|
+
* @example transitTime("-271821-04-19T23:59:00-00:01[Europe/London]", "PT0S") // "" (a zoned string on a local date before Temporal's date range)
|
|
50
68
|
* @example transitTime("2024-06-15T10:00:00", "PT2H") // "" (no zone and no offset: not a moment)
|
|
51
69
|
* @example transitTime("2024-06-15T10:00:00Z", "2 hours") // ""
|
|
52
70
|
*/
|
|
@@ -1,19 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { EXTENDED_UTC_OFFSET, TIME_ZONE_ANNOTATION, utcOffsetStringNanoseconds, wallClockAtOffset, zonedDateTimeFrom, } from "../../internal/index.js";
|
|
3
|
-
import { isValidDuration } from "../../duration/validate/isValidDuration.js";
|
|
4
|
-
import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
5
|
-
import { isValidZonedDateTime } from "../../zoned/validate/isValidZonedDateTime.js";
|
|
6
|
-
/**
|
|
7
|
-
* Trailing `Z` or extended offset of an instant string, before any annotation. The offset grammar
|
|
8
|
-
* is `isValidInstant`'s own (`EXTENDED_UTC_OFFSET`), so every offset it accepts, `,` fractions
|
|
9
|
-
* included, is captured as written.
|
|
10
|
-
*/
|
|
11
|
-
const trailingOffset = new RegExp(`(Z|${EXTENDED_UTC_OFFSET})(?:\\[[^\\]]*\\])*$`);
|
|
12
|
-
/**
|
|
13
|
-
* A time-zone annotation anywhere in the string (`TIME_ZONE_ANNOTATION`). Every `key=value`
|
|
14
|
-
* bracket is a tagged annotation, which `isValidInstant` already decides.
|
|
15
|
-
*/
|
|
16
|
-
const zoneAnnotation = new RegExp(TIME_ZONE_ANNOTATION);
|
|
1
|
+
import { exactDurationNanoseconds, readExactMoment, writeExactMoment, } from "../../internal/index.js";
|
|
17
2
|
/**
|
|
18
3
|
* Add a transit duration to a departure and return the arrival, in the departure's own zone.
|
|
19
4
|
*
|
|
@@ -30,15 +15,30 @@ const zoneAnnotation = new RegExp(TIME_ZONE_ANNOTATION);
|
|
|
30
15
|
* suggest, because that is when the vessel, train or aircraft actually gets there.
|
|
31
16
|
* - **Calendar units are refused.** A `duration` with years, months or weeks returns `""`: no
|
|
32
17
|
* leg takes "a month" in a sense that time arithmetic can fix without a reference point, and
|
|
33
|
-
* Temporal
|
|
34
|
-
* than timed belong to `scheduleDelivery`.
|
|
18
|
+
* Temporal's `round` and `total` require a `relativeTo` for them. Scheduled connections that
|
|
19
|
+
* are dated rather than timed belong to `scheduleDelivery`.
|
|
35
20
|
* - **The departure's zone is preserved.** A bracketed IANA zone (`…-05:00[America/New_York]`)
|
|
36
21
|
* stays that zone, so the arrival's offset is whatever is in force there at arrival. A `Z`
|
|
37
22
|
* instant returns a `Z` instant; an offset-only instant keeps its offset, written exactly as
|
|
38
23
|
* the departure wrote it, sub-minute offsets such as `+05:30:15` included (an offset is not a
|
|
39
24
|
* zone, so nothing else can be inferred from it — see `toOffsetInstant`). A bracketed zone
|
|
40
25
|
* that does not exist, or that contradicts its offset, is rejected as `isValidZonedDateTime`
|
|
41
|
-
* rejects it; it does not fall back to the offset.
|
|
26
|
+
* rejects it; it does not fall back to the offset. An offset written to the minute that is the
|
|
27
|
+
* zone's sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) agrees with the
|
|
28
|
+
* zone, as Temporal writes and reads it, and names the instant the zone gives.
|
|
29
|
+
* - **One zoned departure in range is refused.** A zoned departure is read as
|
|
30
|
+
* `Temporal.ZonedDateTime.from` reads it, which rejects a local date of −271821-04-19. A zone
|
|
31
|
+
* west of Greenwich shows that date for the first hours of the instant range, so a departure
|
|
32
|
+
* written there (`-271821-04-19T23:59:00-00:01[Europe/London]`) returns `""`, although
|
|
33
|
+
* `etaAtZone` writes it and `scheduleDeviation` reads it. Pass the instant in `Z` form.
|
|
34
|
+
* - **Local-time resolution policy (`"compatible"`).** A departure written as a wall time with a
|
|
35
|
+
* bracketed zone and no offset is resolved in that zone with the `"compatible"` policy,
|
|
36
|
+
* Temporal's default and `resolveLocal`'s. An **ambiguous** wall time — a fall-back hour the
|
|
37
|
+
* clock ran through twice — resolves to the **earlier** instant:
|
|
38
|
+
* `2024-11-03T01:30:00[America/New_York]` is `01:30-04:00`. A **nonexistent** one — a
|
|
39
|
+
* spring-forward hour the clock skipped — resolves to the **later** instant:
|
|
40
|
+
* `2024-03-10T02:30:00[America/New_York]` is `03:30-04:00`. Write the offset to name the other
|
|
41
|
+
* pass of a repeated hour; a departure that carries its offset is never re-resolved.
|
|
42
42
|
* - RFC 9557 annotations are read as `Temporal.Instant.from` reads them: a bracket without `=`
|
|
43
43
|
* is a time zone, and a `key=value` bracket with an unknown key is ignored when elective and
|
|
44
44
|
* rejected when critical (`[!…]`). A calendar on a departure without a zone is accepted and
|
|
@@ -61,8 +61,11 @@ const zoneAnnotation = new RegExp(TIME_ZONE_ANNOTATION);
|
|
|
61
61
|
* @example transitTime("2024-06-15T10:00:00+05:30:15", "PT1H") // "2024-06-15T11:00:00+05:30:15" (a sub-minute offset is kept as written)
|
|
62
62
|
* @example transitTime("2024-06-15T10:00:00Z[foo=bar]", "PT1H") // "2024-06-15T11:00:00Z" (an elective unknown annotation is ignored)
|
|
63
63
|
* @example transitTime("2024-06-15T12:30:00-04:00[America/New_York]", "-PT2H30M") // "2024-06-15T10:00:00-04:00[America/New_York]"
|
|
64
|
+
* @example transitTime("2024-11-03T01:30:00[America/New_York]", "PT0S") // "2024-11-03T01:30:00-04:00[America/New_York]" (an ambiguous wall time resolves to the earlier instant)
|
|
65
|
+
* @example transitTime("2024-03-10T02:30:00[America/New_York]", "PT0S") // "2024-03-10T03:30:00-04:00[America/New_York]" (a nonexistent wall time resolves to the later instant)
|
|
64
66
|
* @example transitTime("2024-06-15T10:00:00-04:00[America/New_York]", "P1M") // "" (calendar units need a reference point)
|
|
65
67
|
* @example transitTime("2024-06-15T10:00:00-05:00[America/New_York]", "PT2H") // "" (New York is -04:00 in June: the offset contradicts the zone)
|
|
68
|
+
* @example transitTime("-271821-04-19T23:59:00-00:01[Europe/London]", "PT0S") // "" (a zoned string on a local date before Temporal's date range)
|
|
66
69
|
* @example transitTime("2024-06-15T10:00:00", "PT2H") // "" (no zone and no offset: not a moment)
|
|
67
70
|
* @example transitTime("2024-06-15T10:00:00Z", "2 hours") // ""
|
|
68
71
|
*/
|
|
@@ -83,36 +86,16 @@ export function transitTime(departure, duration) {
|
|
|
83
86
|
}
|
|
84
87
|
/** `transitTime` for two strings, without the guard. */
|
|
85
88
|
function addLeg(departure, duration) {
|
|
86
|
-
|
|
89
|
+
// Days are 24 exact hours; years, months and weeks are refused.
|
|
90
|
+
const amount = exactDurationNanoseconds(duration);
|
|
91
|
+
if (amount === null) {
|
|
87
92
|
return "";
|
|
88
93
|
}
|
|
89
|
-
const zoned = isValidZonedDateTime(departure);
|
|
90
94
|
// A string that names a zone must name a real one that agrees with its offset; only a string
|
|
91
|
-
// that names none
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
return "";
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
const parsed = Temporal.Duration.from(duration);
|
|
98
|
-
if (parsed.years !== 0 || parsed.months !== 0 || parsed.weeks !== 0) {
|
|
99
|
-
return "";
|
|
100
|
-
}
|
|
101
|
-
// Days become 24 exact hours; every remaining unit is already exact time.
|
|
102
|
-
const exact = parsed.round({ largestUnit: "hours" });
|
|
103
|
-
if (zoned) {
|
|
104
|
-
return zonedDateTimeFrom(departure).add(exact).toString();
|
|
105
|
-
}
|
|
106
|
-
const arrival = Temporal.Instant.from(departure).add(exact);
|
|
107
|
-
const offset = trailingOffset.exec(departure)?.[1] ?? "Z";
|
|
108
|
-
if (offset === "Z") {
|
|
109
|
-
return arrival.toString();
|
|
110
|
-
}
|
|
111
|
-
// The arrival's wall clock in the departure's own offset, written with that offset's text.
|
|
112
|
-
const wall = wallClockAtOffset(arrival, utcOffsetStringNanoseconds(offset));
|
|
113
|
-
return `${wall.toString()}${offset}`;
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
95
|
+
// that names none is read as an instant, keeping its offset text.
|
|
96
|
+
const moment = readExactMoment(departure);
|
|
97
|
+
if (moment === null) {
|
|
116
98
|
return "";
|
|
117
99
|
}
|
|
100
|
+
return writeExactMoment(moment.nanoseconds + amount, moment.notation);
|
|
118
101
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Punctuality, PunctualityTolerance } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Classify an arrival as early, on time or late against the caller's tolerance.
|
|
4
|
+
*
|
|
5
|
+
* "On time" without a stated tolerance is not a measurement, and the tolerance differs by mode:
|
|
6
|
+
* a 15-minute tolerance (`{ late: "PT15M" }`), a 60/120-minute pair compared side by side, or a
|
|
7
|
+
* day-based one (`{ late: "P1D", early: "P1D" }`). GMT holds no default; the caller states it.
|
|
8
|
+
*
|
|
9
|
+
* - The deviation is `scheduleDeviation`'s: `actual` minus `planned` in exact elapsed time, so a
|
|
10
|
+
* delay across a DST transition is measured in real minutes, never wall-clock ones.
|
|
11
|
+
* - **Late** when the deviation is `late` or more: exactly 15 minutes against `PT15M` is late.
|
|
12
|
+
* - **Early** when `early` is given and the deviation is `-early` or less: exactly 10 minutes
|
|
13
|
+
* early against `PT10M` is early.
|
|
14
|
+
* - **On time** only strictly inside the tolerance: after `-early` (when given) and before
|
|
15
|
+
* `late`. Both boundaries belong to the outside. This convention is GMT's own, stated here, not
|
|
16
|
+
* a reading of any rule.
|
|
17
|
+
* - **Without `early`, every early arrival is on time.** `early: undefined` is the same as
|
|
18
|
+
* leaving it out; `early: null` is invalid.
|
|
19
|
+
* - `late: "PT0S"` leaves no on-time window after the plan: an arrival exactly on the plan is
|
|
20
|
+
* late. `early: "PT0S"` leaves none before it: an arrival exactly on the plan is early (with a
|
|
21
|
+
* non-zero `late`), because both boundaries are outside the on-time window. With both at
|
|
22
|
+
* `"PT0S"`, nothing is on time; late is checked first, so the plan itself is late.
|
|
23
|
+
* - Tolerances are exact durations: a day is 24 hours; years, months and weeks return `null`, as
|
|
24
|
+
* does a negative tolerance (`-PT0S` is zero).
|
|
25
|
+
* - Both times are an instant (`Z`/offset) or a zoned string, read as `scheduleDeviation` reads
|
|
26
|
+
* them: the offset fixes the instant, and an offset written to the minute that is the
|
|
27
|
+
* bracketed zone's sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names
|
|
28
|
+
* the instant the zone gives. Otherwise the bracket is not checked.
|
|
29
|
+
* - Returns `null` on invalid input.
|
|
30
|
+
*
|
|
31
|
+
* @param planned ISO 8601 instant or zoned datetime string of the planned time
|
|
32
|
+
* @param actual ISO 8601 instant or zoned datetime string of the actual time
|
|
33
|
+
* @param tolerance late (required) and early (optional) tolerances as ISO 8601 durations of exact time
|
|
34
|
+
* @returns "early", "onTime" or "late", or null on invalid input
|
|
35
|
+
*
|
|
36
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:59Z", { late: "PT15M" }) // "onTime"
|
|
37
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:15:00Z", { late: "PT15M" }) // "late" (exactly the tolerance is late)
|
|
38
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T08:00:00Z", { late: "PT15M" }) // "onTime" (without early, an early arrival is on time)
|
|
39
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T09:49:00Z", { late: "PT15M", early: "PT10M" }) // "early"
|
|
40
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T11:30:00Z", { late: "PT120M" }) // "onTime" (a 90-minute delay under a 120-minute tolerance)
|
|
41
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:00:00Z", { late: "PT15M", early: "PT0S" }) // "early" (exactly on the plan is on the early boundary, which is outside)
|
|
42
|
+
* @example classifyPunctuality("2024-11-03T01:30:00-04:00[America/New_York]", "2024-11-03T01:30:00-05:00[America/New_York]", { late: "PT15M" }) // "late" (the same wall time an hour later, across the fall-back)
|
|
43
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:00Z", { late: "-PT15M" }) // null (a negative tolerance)
|
|
44
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:00Z", { late: "P1W" }) // null (weeks need a reference point)
|
|
45
|
+
*/
|
|
46
|
+
export declare function classifyPunctuality(planned: string, actual: string, tolerance: PunctualityTolerance): Punctuality | null;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { parseInstantNanoseconds, parsePunctualityTolerance, punctualityOf, } from "../../internal/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Classify an arrival as early, on time or late against the caller's tolerance.
|
|
4
|
+
*
|
|
5
|
+
* "On time" without a stated tolerance is not a measurement, and the tolerance differs by mode:
|
|
6
|
+
* a 15-minute tolerance (`{ late: "PT15M" }`), a 60/120-minute pair compared side by side, or a
|
|
7
|
+
* day-based one (`{ late: "P1D", early: "P1D" }`). GMT holds no default; the caller states it.
|
|
8
|
+
*
|
|
9
|
+
* - The deviation is `scheduleDeviation`'s: `actual` minus `planned` in exact elapsed time, so a
|
|
10
|
+
* delay across a DST transition is measured in real minutes, never wall-clock ones.
|
|
11
|
+
* - **Late** when the deviation is `late` or more: exactly 15 minutes against `PT15M` is late.
|
|
12
|
+
* - **Early** when `early` is given and the deviation is `-early` or less: exactly 10 minutes
|
|
13
|
+
* early against `PT10M` is early.
|
|
14
|
+
* - **On time** only strictly inside the tolerance: after `-early` (when given) and before
|
|
15
|
+
* `late`. Both boundaries belong to the outside. This convention is GMT's own, stated here, not
|
|
16
|
+
* a reading of any rule.
|
|
17
|
+
* - **Without `early`, every early arrival is on time.** `early: undefined` is the same as
|
|
18
|
+
* leaving it out; `early: null` is invalid.
|
|
19
|
+
* - `late: "PT0S"` leaves no on-time window after the plan: an arrival exactly on the plan is
|
|
20
|
+
* late. `early: "PT0S"` leaves none before it: an arrival exactly on the plan is early (with a
|
|
21
|
+
* non-zero `late`), because both boundaries are outside the on-time window. With both at
|
|
22
|
+
* `"PT0S"`, nothing is on time; late is checked first, so the plan itself is late.
|
|
23
|
+
* - Tolerances are exact durations: a day is 24 hours; years, months and weeks return `null`, as
|
|
24
|
+
* does a negative tolerance (`-PT0S` is zero).
|
|
25
|
+
* - Both times are an instant (`Z`/offset) or a zoned string, read as `scheduleDeviation` reads
|
|
26
|
+
* them: the offset fixes the instant, and an offset written to the minute that is the
|
|
27
|
+
* bracketed zone's sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names
|
|
28
|
+
* the instant the zone gives. Otherwise the bracket is not checked.
|
|
29
|
+
* - Returns `null` on invalid input.
|
|
30
|
+
*
|
|
31
|
+
* @param planned ISO 8601 instant or zoned datetime string of the planned time
|
|
32
|
+
* @param actual ISO 8601 instant or zoned datetime string of the actual time
|
|
33
|
+
* @param tolerance late (required) and early (optional) tolerances as ISO 8601 durations of exact time
|
|
34
|
+
* @returns "early", "onTime" or "late", or null on invalid input
|
|
35
|
+
*
|
|
36
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:59Z", { late: "PT15M" }) // "onTime"
|
|
37
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:15:00Z", { late: "PT15M" }) // "late" (exactly the tolerance is late)
|
|
38
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T08:00:00Z", { late: "PT15M" }) // "onTime" (without early, an early arrival is on time)
|
|
39
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T09:49:00Z", { late: "PT15M", early: "PT10M" }) // "early"
|
|
40
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T11:30:00Z", { late: "PT120M" }) // "onTime" (a 90-minute delay under a 120-minute tolerance)
|
|
41
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:00:00Z", { late: "PT15M", early: "PT0S" }) // "early" (exactly on the plan is on the early boundary, which is outside)
|
|
42
|
+
* @example classifyPunctuality("2024-11-03T01:30:00-04:00[America/New_York]", "2024-11-03T01:30:00-05:00[America/New_York]", { late: "PT15M" }) // "late" (the same wall time an hour later, across the fall-back)
|
|
43
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:00Z", { late: "-PT15M" }) // null (a negative tolerance)
|
|
44
|
+
* @example classifyPunctuality("2024-06-15T10:00:00Z", "2024-06-15T10:14:00Z", { late: "P1W" }) // null (weeks need a reference point)
|
|
45
|
+
*/
|
|
46
|
+
export function classifyPunctuality(planned, actual, tolerance) {
|
|
47
|
+
try {
|
|
48
|
+
const bounds = parsePunctualityTolerance(tolerance);
|
|
49
|
+
if (bounds === null) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const plannedNanoseconds = parseInstantNanoseconds(planned);
|
|
53
|
+
const actualNanoseconds = parseInstantNanoseconds(actual);
|
|
54
|
+
if (plannedNanoseconds === null || actualNanoseconds === null) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return punctualityOf(actualNanoseconds - plannedNanoseconds, bounds);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Never throws (Core Rule 3): a hostile
|
|
61
|
+
// argument is invalid input, not an exception.
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report whether a cut-off has passed.
|
|
3
|
+
*
|
|
4
|
+
* The window to meet a cut-off is half-open, `[…, cutoff)`: at the cut-off instant itself it
|
|
5
|
+
* has closed, so `now` equal to `cutoff` is past. This matches the half-open rule GMT's
|
|
6
|
+
* intervals follow, and `timeToCutoff`, which is `PT0S` there.
|
|
7
|
+
*
|
|
8
|
+
* - Both arguments are exact: an instant (`Z`/offset) or a zoned string, as `cutoffAt`
|
|
9
|
+
* returns one. They are compared as instants, so the zone each is written in does not
|
|
10
|
+
* matter, and the two passes of a repeated hour are told apart by their offsets.
|
|
11
|
+
* - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
|
|
12
|
+
* written to the minute that is the bracketed zone's sub-minute offset rounded
|
|
13
|
+
* (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
|
|
14
|
+
* `Temporal.ZonedDateTime.from` reads it, so a cut-off `cutoffAt` wrote is the instant it
|
|
15
|
+
* computed, except a wall time repeated inside a sub-minute offset change, which reads as
|
|
16
|
+
* its first pass (see `isValidInstant`). Otherwise the bracket is not checked: a zone that does not exist, or that
|
|
17
|
+
* disagrees with the offset, changes nothing.
|
|
18
|
+
* - `now` is the caller's: GMT does not read the clock here, so the answer is reproducible.
|
|
19
|
+
* - Returns `false` on invalid input, including `cutoffAt`'s `""` sentinel — which reads as
|
|
20
|
+
* "not past". Check the cut-off is not `""` before trusting a `false`.
|
|
21
|
+
*
|
|
22
|
+
* @param now ISO 8601 instant or zoned datetime string of the moment asked about
|
|
23
|
+
* @param cutoff ISO 8601 instant or zoned datetime string of the cut-off
|
|
24
|
+
* @returns true when now is at or after the cut-off, false otherwise or on invalid input
|
|
25
|
+
*
|
|
26
|
+
* @example isPastCutoff("2024-06-12T16:00:00Z", "2024-06-12T17:00:00+02:00[Europe/Amsterdam]") // true
|
|
27
|
+
* @example isPastCutoff("2024-06-12T14:00:00Z", "2024-06-12T17:00:00+02:00[Europe/Amsterdam]") // false
|
|
28
|
+
* @example isPastCutoff("2024-06-12T15:00:00Z", "2024-06-12T17:00:00+02:00[Europe/Amsterdam]") // true (at the cut-off, the window has closed)
|
|
29
|
+
* @example isPastCutoff("2024-11-03T01:30:00-05:00[America/New_York]", "2024-11-03T01:30:00-04:00[America/New_York]") // true (the second 01:30 is an hour after the first)
|
|
30
|
+
* @example isPastCutoff("2024-06-12T16:00:00", "2024-06-12T17:00:00+02:00[Europe/Amsterdam]") // false (a zoneless now is not a moment)
|
|
31
|
+
* @example isPastCutoff("2024-06-12T16:00:00Z", "") // false
|
|
32
|
+
*/
|
|
33
|
+
export declare function isPastCutoff(now: string, cutoff: string): boolean;
|