@northguild/gmt 1.17.0 → 1.19.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 +55 -2480
- package/dist/calendar/calculate/bucketRange.d.ts +12 -4
- package/dist/calendar/calculate/bucketRange.js +20 -63
- package/dist/calendar/calculate/floorToZone.d.ts +14 -4
- package/dist/calendar/calculate/floorToZone.js +18 -9
- 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 +59 -0
- package/dist/calendar/hours/addOperatingTime.js +65 -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 +45 -0
- package/dist/calendar/hours/isOpenAt.js +50 -0
- package/dist/calendar/hours/nextCloseAt.d.ts +55 -0
- package/dist/calendar/hours/nextCloseAt.js +57 -0
- package/dist/calendar/hours/nextOpenAt.d.ts +51 -0
- package/dist/calendar/hours/nextOpenAt.js +53 -0
- package/dist/calendar/hours/operatingIntervals.d.ts +48 -0
- package/dist/calendar/hours/operatingIntervals.js +57 -0
- package/dist/calendar/hours/operatingTimeBetween.d.ts +45 -0
- package/dist/calendar/hours/operatingTimeBetween.js +54 -0
- package/dist/calendar/hours/recurringWindows.d.ts +68 -0
- package/dist/calendar/hours/recurringWindows.js +88 -0
- package/dist/calendar/index.d.ts +1 -0
- package/dist/calendar/index.js +1 -0
- package/dist/duration/calculate/durationFromUnits.d.ts +47 -0
- package/dist/duration/calculate/durationFromUnits.js +67 -0
- package/dist/duration/calculate/getDurationUnit.d.ts +2 -2
- package/dist/duration/calculate/getDurationUnit.js +2 -2
- package/dist/duration/calculate/index.d.ts +3 -1
- package/dist/duration/calculate/index.js +3 -1
- package/dist/duration/calculate/negateDuration.d.ts +1 -1
- package/dist/duration/calculate/negateDuration.js +1 -1
- package/dist/duration/calculate/totalDuration.d.ts +73 -0
- package/dist/duration/calculate/{durationAs.js → totalDuration.js} +29 -27
- package/dist/duration/calculate/totalUnits.d.ts +49 -0
- package/dist/duration/calculate/totalUnits.js +73 -0
- package/dist/duration/compare/compareDurations.d.ts +13 -7
- package/dist/duration/compare/compareDurations.js +4 -7
- 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/duty/calculate/dutyDayFor.d.ts +38 -0
- package/dist/duty/calculate/dutyDayFor.js +71 -0
- package/dist/duty/calculate/dutyTotals.d.ts +24 -0
- package/dist/duty/calculate/dutyTotals.js +41 -0
- package/dist/duty/calculate/dutyViolations.d.ts +74 -0
- package/dist/duty/calculate/dutyViolations.js +65 -0
- package/dist/duty/calculate/evaluateDutyLog.d.ts +77 -0
- package/dist/duty/calculate/evaluateDutyLog.js +75 -0
- package/dist/duty/calculate/index.d.ts +7 -0
- package/dist/duty/calculate/index.js +7 -0
- package/dist/duty/calculate/longestRun.d.ts +28 -0
- package/dist/duty/calculate/longestRun.js +54 -0
- package/dist/duty/calculate/qualifyingRestPairs.d.ts +37 -0
- package/dist/duty/calculate/qualifyingRestPairs.js +58 -0
- package/dist/duty/calculate/qualifyingRests.d.ts +27 -0
- package/dist/duty/calculate/qualifyingRests.js +49 -0
- package/dist/duty/index.d.ts +3 -0
- package/dist/duty/index.js +4 -0
- package/dist/duty/validate/index.d.ts +1 -0
- package/dist/duty/validate/index.js +1 -0
- package/dist/duty/validate/isValidDutyLog.d.ts +24 -0
- package/dist/duty/validate/isValidDutyLog.js +34 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/instant/convert/classifyLocal.d.ts +5 -1
- package/dist/instant/convert/classifyLocal.js +16 -6
- package/dist/instant/convert/fromOffsetInstant.d.ts +7 -1
- package/dist/instant/convert/fromOffsetInstant.js +9 -2
- package/dist/instant/convert/resolveLocal.d.ts +18 -8
- package/dist/instant/convert/resolveLocal.js +21 -17
- package/dist/instant/convert/toOffsetInstant.d.ts +33 -16
- package/dist/instant/convert/toOffsetInstant.js +28 -13
- package/dist/instant/index.d.ts +1 -0
- package/dist/instant/index.js +1 -0
- package/dist/instant/validate/index.d.ts +1 -0
- package/dist/instant/validate/index.js +1 -0
- package/dist/instant/validate/isValidUtcOffset.d.ts +32 -0
- package/dist/instant/validate/isValidUtcOffset.js +35 -0
- package/dist/intermodal/calculate/billingTimeline.d.ts +31 -11
- package/dist/intermodal/calculate/billingTimeline.js +2 -2
- package/dist/intermodal/calculate/chargeableDays.d.ts +19 -11
- package/dist/intermodal/calculate/chargeableDays.js +13 -10
- package/dist/intermodal/calculate/demurrageClock.d.ts +16 -7
- package/dist/intermodal/calculate/demurrageClock.js +7 -7
- package/dist/intermodal/calculate/freeTimeExpiry.d.ts +12 -4
- package/dist/intermodal/calculate/freeTimeExpiry.js +19 -8
- package/dist/intermodal/calculate/index.d.ts +1 -0
- package/dist/intermodal/calculate/index.js +1 -0
- package/dist/intermodal/calculate/multimodalETA.d.ts +76 -0
- package/dist/intermodal/calculate/multimodalETA.js +145 -0
- package/dist/intermodal/format/bolTimestamp.d.ts +76 -0
- package/dist/intermodal/format/bolTimestamp.js +78 -0
- package/dist/intermodal/format/formatEdifactDate.d.ts +34 -0
- package/dist/intermodal/format/formatEdifactDate.js +42 -0
- package/dist/intermodal/format/formatEdifactDatePeriod.d.ts +35 -0
- package/dist/intermodal/format/formatEdifactDatePeriod.js +43 -0
- package/dist/intermodal/format/formatEdifactDateTime.d.ts +37 -0
- package/dist/intermodal/format/formatEdifactDateTime.js +45 -0
- package/dist/intermodal/format/formatEdifactDateTimePeriod.d.ts +40 -0
- package/dist/intermodal/format/formatEdifactDateTimePeriod.js +48 -0
- package/dist/intermodal/format/formatEdifactOffsetDateTime.d.ts +62 -0
- package/dist/intermodal/format/formatEdifactOffsetDateTime.js +70 -0
- package/dist/intermodal/format/formatEdifactTime.d.ts +35 -0
- package/dist/intermodal/format/formatEdifactTime.js +43 -0
- package/dist/intermodal/format/formatEpcisEvent.d.ts +47 -0
- package/dist/intermodal/format/formatEpcisEvent.js +79 -0
- package/dist/intermodal/format/formatX12Date.d.ts +35 -0
- package/dist/intermodal/format/formatX12Date.js +43 -0
- package/dist/intermodal/format/formatX12DateRange.d.ts +37 -0
- package/dist/intermodal/format/formatX12DateRange.js +45 -0
- package/dist/intermodal/format/formatX12DateTime.d.ts +39 -0
- package/dist/intermodal/format/formatX12DateTime.js +47 -0
- package/dist/intermodal/format/formatX12DateTimeRange.d.ts +40 -0
- package/dist/intermodal/format/formatX12DateTimeRange.js +48 -0
- package/dist/intermodal/format/formatX12Time.d.ts +42 -0
- package/dist/intermodal/format/formatX12Time.js +50 -0
- package/dist/intermodal/format/formatX12TimeElement.d.ts +46 -0
- package/dist/intermodal/format/formatX12TimeElement.js +54 -0
- package/dist/intermodal/format/index.d.ts +14 -0
- package/dist/intermodal/format/index.js +14 -0
- package/dist/intermodal/index.d.ts +3 -0
- package/dist/intermodal/index.js +3 -0
- package/dist/intermodal/parse/classifyEdifactDtmFormat.d.ts +48 -0
- package/dist/intermodal/parse/classifyEdifactDtmFormat.js +55 -0
- package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.d.ts +50 -0
- package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.js +57 -0
- package/dist/intermodal/parse/classifyX12TimeCode.d.ts +46 -0
- package/dist/intermodal/parse/classifyX12TimeCode.js +57 -0
- package/dist/intermodal/parse/index.d.ts +18 -0
- package/dist/intermodal/parse/index.js +18 -0
- package/dist/intermodal/parse/parseEdifactDate.d.ts +37 -0
- package/dist/intermodal/parse/parseEdifactDate.js +45 -0
- package/dist/intermodal/parse/parseEdifactDatePeriod.d.ts +43 -0
- package/dist/intermodal/parse/parseEdifactDatePeriod.js +51 -0
- package/dist/intermodal/parse/parseEdifactDateTime.d.ts +43 -0
- package/dist/intermodal/parse/parseEdifactDateTime.js +51 -0
- package/dist/intermodal/parse/parseEdifactDateTimePeriod.d.ts +45 -0
- package/dist/intermodal/parse/parseEdifactDateTimePeriod.js +53 -0
- package/dist/intermodal/parse/parseEdifactOffsetDateTime.d.ts +60 -0
- package/dist/intermodal/parse/parseEdifactOffsetDateTime.js +68 -0
- package/dist/intermodal/parse/parseEdifactTime.d.ts +37 -0
- package/dist/intermodal/parse/parseEdifactTime.js +45 -0
- package/dist/intermodal/parse/parseEpcisEvent.d.ts +95 -0
- package/dist/intermodal/parse/parseEpcisEvent.js +102 -0
- package/dist/intermodal/parse/parseX12Date.d.ts +39 -0
- package/dist/intermodal/parse/parseX12Date.js +47 -0
- package/dist/intermodal/parse/parseX12DateAndTime.d.ts +52 -0
- package/dist/intermodal/parse/parseX12DateAndTime.js +61 -0
- package/dist/intermodal/parse/parseX12DateRange.d.ts +44 -0
- package/dist/intermodal/parse/parseX12DateRange.js +52 -0
- package/dist/intermodal/parse/parseX12DateTime.d.ts +45 -0
- package/dist/intermodal/parse/parseX12DateTime.js +53 -0
- package/dist/intermodal/parse/parseX12DateTimeRange.d.ts +46 -0
- package/dist/intermodal/parse/parseX12DateTimeRange.js +54 -0
- package/dist/intermodal/parse/parseX12Time.d.ts +65 -0
- package/dist/intermodal/parse/parseX12Time.js +77 -0
- package/dist/intermodal/parse/x12TimeCodeOffset.d.ts +57 -0
- package/dist/intermodal/parse/x12TimeCodeOffset.js +110 -0
- package/dist/intermodal/parse/x12TimeCodeZone.d.ts +57 -0
- package/dist/intermodal/parse/x12TimeCodeZone.js +105 -0
- package/dist/intermodal/validate/index.d.ts +18 -0
- package/dist/intermodal/validate/index.js +18 -0
- package/dist/intermodal/validate/isValidEdifactDate.d.ts +26 -0
- package/dist/intermodal/validate/isValidEdifactDate.js +28 -0
- package/dist/intermodal/validate/isValidEdifactDatePeriod.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactDatePeriod.js +30 -0
- package/dist/intermodal/validate/isValidEdifactDateTime.d.ts +30 -0
- package/dist/intermodal/validate/isValidEdifactDateTime.js +32 -0
- package/dist/intermodal/validate/isValidEdifactDateTimePeriod.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactDateTimePeriod.js +30 -0
- package/dist/intermodal/validate/isValidEdifactDtmFormat.d.ts +39 -0
- package/dist/intermodal/validate/isValidEdifactDtmFormat.js +42 -0
- package/dist/intermodal/validate/isValidEdifactOffsetDateTime.d.ts +36 -0
- package/dist/intermodal/validate/isValidEdifactOffsetDateTime.js +38 -0
- package/dist/intermodal/validate/isValidEdifactTime.d.ts +28 -0
- package/dist/intermodal/validate/isValidEdifactTime.js +30 -0
- package/dist/intermodal/validate/isValidEpcisEvent.d.ts +41 -0
- package/dist/intermodal/validate/isValidEpcisEvent.js +58 -0
- package/dist/intermodal/validate/isValidEpcisEventTime.d.ts +33 -0
- package/dist/intermodal/validate/isValidEpcisEventTime.js +48 -0
- package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.d.ts +30 -0
- package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.js +38 -0
- package/dist/intermodal/validate/isValidX12Date.d.ts +28 -0
- package/dist/intermodal/validate/isValidX12Date.js +30 -0
- package/dist/intermodal/validate/isValidX12DateAndTime.d.ts +32 -0
- package/dist/intermodal/validate/isValidX12DateAndTime.js +35 -0
- package/dist/intermodal/validate/isValidX12DateRange.d.ts +29 -0
- package/dist/intermodal/validate/isValidX12DateRange.js +31 -0
- package/dist/intermodal/validate/isValidX12DateTime.d.ts +30 -0
- package/dist/intermodal/validate/isValidX12DateTime.js +32 -0
- package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.d.ts +43 -0
- package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.js +46 -0
- package/dist/intermodal/validate/isValidX12DateTimeRange.d.ts +31 -0
- package/dist/intermodal/validate/isValidX12DateTimeRange.js +33 -0
- package/dist/intermodal/validate/isValidX12Time.d.ts +38 -0
- package/dist/intermodal/validate/isValidX12Time.js +40 -0
- package/dist/intermodal/validate/isValidX12TimeCode.d.ts +38 -0
- package/dist/intermodal/validate/isValidX12TimeCode.js +41 -0
- package/dist/internal/businessCalendar.d.ts +5 -0
- package/dist/internal/businessCalendar.js +9 -10
- 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/dutyEngine.d.ts +125 -0
- package/dist/internal/dutyEngine.js +1746 -0
- package/dist/internal/dutyLog.d.ts +27 -0
- package/dist/internal/dutyLog.js +47 -0
- package/dist/internal/dutyPeriods.d.ts +135 -0
- package/dist/internal/dutyPeriods.js +369 -0
- package/dist/internal/dutyRules.d.ts +197 -0
- package/dist/internal/dutyRules.js +484 -0
- package/dist/internal/ediDateTimeFields.d.ts +97 -0
- package/dist/internal/ediDateTimeFields.js +288 -0
- package/dist/internal/ediDateTimeWriter.d.ts +92 -0
- package/dist/internal/ediDateTimeWriter.js +298 -0
- package/dist/internal/ediGrammar.d.ts +158 -0
- package/dist/internal/ediGrammar.js +384 -0
- package/dist/internal/englishCalendarNames.d.ts +3 -1
- package/dist/internal/englishCalendarNames.js +4 -3
- 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/freeTimeLedger.d.ts +5 -0
- package/dist/internal/freeTimeLedger.js +11 -2
- package/dist/internal/index.d.ts +12 -4
- package/dist/internal/index.js +16 -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/intervalNanoseconds.js +2 -1
- package/dist/internal/isObject.d.ts +13 -6
- package/dist/internal/isObject.js +14 -7
- package/dist/internal/isoYearString.d.ts +21 -0
- package/dist/internal/isoYearString.js +27 -0
- package/dist/internal/joinDateTimeConnector.d.ts +1 -1
- package/dist/internal/maxPieces.js +2 -1
- package/dist/internal/monthGridWeekRow.d.ts +2 -1
- package/dist/internal/monthGridWeekRow.js +2 -1
- package/dist/internal/normalizeTimeZone.d.ts +5 -2
- package/dist/internal/normalizeTimeZone.js +5 -2
- package/dist/internal/operatingSchedule.d.ts +138 -0
- package/dist/internal/operatingSchedule.js +756 -0
- package/dist/internal/optionOrDefault.d.ts +18 -0
- package/dist/internal/optionOrDefault.js +20 -0
- package/dist/internal/patternToken.d.ts +12 -5
- package/dist/internal/patternToken.js +59 -25
- 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/readDurationUnits.d.ts +34 -0
- package/dist/internal/readDurationUnits.js +78 -0
- package/dist/internal/readSetFields.d.ts +50 -0
- package/dist/internal/readSetFields.js +179 -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/resolveUnixIntervalPair.d.ts +8 -2
- package/dist/internal/resolveUnixIntervalPair.js +11 -7
- package/dist/internal/splitStep.d.ts +24 -1
- package/dist/internal/splitStep.js +34 -2
- package/dist/internal/startOrEndOfUnix.d.ts +2 -1
- package/dist/internal/startOrEndOfUnix.js +9 -6
- 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/twoDigitYear.d.ts +19 -0
- package/dist/internal/twoDigitYear.js +22 -0
- package/dist/internal/unixEpochValue.js +3 -2
- package/dist/internal/unixWallClock.d.ts +24 -0
- package/dist/internal/unixWallClock.js +35 -0
- package/dist/internal/utcWallClock.d.ts +20 -0
- package/dist/internal/utcWallClock.js +32 -0
- package/dist/internal/yearWindowStart.d.ts +28 -0
- package/dist/internal/yearWindowStart.js +52 -0
- package/dist/internal/zoneBucketCap.d.ts +18 -0
- package/dist/internal/zoneBucketCap.js +64 -0
- package/dist/internal/zoneFrame.d.ts +180 -0
- package/dist/internal/zoneFrame.js +221 -0
- package/dist/internal/zonedBucket.js +8 -6
- package/dist/internal/zonedLocalDates.js +1 -1
- package/dist/internal/zonedNowUnitValue.d.ts +7 -4
- package/dist/internal/zonedNowUnitValue.js +8 -4
- 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/zonedWallClockDifference.js +4 -4
- package/dist/internal/zonedWallClockOperations.d.ts +31 -15
- package/dist/internal/zonedWallClockOperations.js +93 -43
- 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 +9 -15
- package/dist/plain/calculate/addDateTime.d.ts +7 -4
- package/dist/plain/calculate/addDateTime.js +5 -11
- package/dist/plain/calculate/addTime.js +4 -7
- 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 +9 -3
- 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 +27 -8
- package/dist/plain/calculate/setDate.js +28 -12
- package/dist/plain/calculate/setDateTime.d.ts +23 -8
- package/dist/plain/calculate/setDateTime.js +23 -12
- package/dist/plain/calculate/setTime.d.ts +23 -7
- package/dist/plain/calculate/setTime.js +25 -12
- 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 +9 -2
- package/dist/plain/calculate/startOfTime.js +1 -1
- package/dist/plain/calculate/subtractDate.d.ts +7 -4
- package/dist/plain/calculate/subtractDate.js +5 -11
- package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
- package/dist/plain/calculate/subtractDateTime.js +5 -11
- package/dist/plain/calculate/subtractTime.js +4 -7
- 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 +23 -17
- 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 +28 -16
- package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
- package/dist/plain/format/formatRelativeDateTime.js +10 -6
- package/dist/plain/format/formatRelativeTime.d.ts +16 -3
- package/dist/plain/format/formatRelativeTime.js +23 -14
- package/dist/plain/format/{formatSql.d.ts → formatSqlDateTime.d.ts} +7 -7
- package/dist/plain/format/{formatSql.js → formatSqlDateTime.js} +7 -7
- package/dist/plain/format/formatTime.js +4 -2
- package/dist/plain/format/index.d.ts +1 -1
- package/dist/plain/format/index.js +1 -1
- package/dist/plain/get/getNowUnit.d.ts +2 -0
- package/dist/plain/get/getNowUnit.js +2 -0
- package/dist/plain/get/getYear.d.ts +2 -0
- package/dist/plain/get/getYear.js +4 -3
- 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/intervalXorAllDate.js +2 -2
- package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllDateTime.js +2 -2
- package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
- package/dist/plain/interval/intervalXorAllTime.js +2 -2
- 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/mergeIntervalsDate.js +2 -2
- package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsDateTime.js +2 -2
- package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
- package/dist/plain/interval/mergeIntervalsTime.js +2 -2
- 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/index.d.ts +1 -1
- package/dist/plain/parse/index.js +1 -1
- package/dist/plain/parse/parseDateTimeWithPattern.d.ts +25 -9
- package/dist/plain/parse/parseDateTimeWithPattern.js +29 -11
- package/dist/plain/parse/parseDateWithPattern.d.ts +26 -9
- package/dist/plain/parse/parseDateWithPattern.js +30 -11
- package/dist/plain/parse/{parseSql.d.ts → parseSqlDateTime.d.ts} +8 -8
- package/dist/plain/parse/{parseSql.js → parseSqlDateTime.js} +8 -8
- package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
- package/dist/plain/parse/parseTimeWithPattern.js +11 -7
- package/dist/plain/parse/parseUnitFromDate.d.ts +14 -3
- package/dist/plain/parse/parseUnitFromDate.js +8 -4
- package/dist/plain/parse/parseUnitFromDateTime.d.ts +14 -3
- package/dist/plain/parse/parseUnitFromDateTime.js +8 -4
- 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/parse/parseYearFromDate.d.ts +5 -2
- package/dist/plain/parse/parseYearFromDate.js +7 -3
- package/dist/plain/parse/parseYearFromDateTime.d.ts +4 -2
- package/dist/plain/parse/parseYearFromDateTime.js +6 -3
- package/dist/plain/validate/index.d.ts +1 -0
- package/dist/plain/validate/index.js +1 -0
- 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/isValidSqlDateTime.d.ts +33 -0
- package/dist/plain/validate/isValidSqlDateTime.js +36 -0
- 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 +9 -3
- package/dist/precision/convert/fromNanoseconds.js +9 -3
- 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/regex/epcis.d.ts +60 -0
- package/dist/regex/epcis.js +60 -0
- package/dist/regex/http-date.d.ts +6 -4
- package/dist/regex/http-date.js +6 -4
- package/dist/regex/index.d.ts +1 -0
- package/dist/regex/index.js +1 -0
- package/dist/regex/rfc-2822.d.ts +2 -0
- package/dist/regex/rfc-2822.js +2 -0
- package/dist/regex/rfc-3339.d.ts +3 -1
- package/dist/regex/rfc-3339.js +3 -1
- package/dist/regex/sql-date-time.d.ts +2 -1
- package/dist/regex/sql-date-time.js +2 -1
- package/dist/regex/time-zone-like.d.ts +3 -2
- package/dist/regex/time-zone-like.js +3 -2
- package/dist/regex/utc-offset.d.ts +2 -1
- package/dist/regex/utc-offset.js +2 -1
- 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 +63 -0
- package/dist/transport/calculate/crossingTime.js +81 -0
- package/dist/transport/calculate/cutoffAt.d.ts +95 -0
- package/dist/transport/calculate/cutoffAt.js +211 -0
- package/dist/transport/calculate/cutoffSchedule.d.ts +75 -0
- package/dist/transport/calculate/cutoffSchedule.js +73 -0
- package/dist/transport/calculate/dwellTime.d.ts +22 -8
- package/dist/transport/calculate/dwellTime.js +18 -9
- 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 +158 -0
- package/dist/transport/calculate/scheduleDelivery.js +305 -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 +13 -1
- package/dist/transport/convert/etaAtZone.js +15 -5
- package/dist/transport/index.d.ts +1 -0
- package/dist/transport/index.js +1 -0
- package/dist/types/business-calendar.d.ts +20 -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/duty.d.ts +777 -0
- package/dist/types/edi.d.ts +407 -0
- package/dist/types/edi.js +0 -0
- package/dist/types/epcis.d.ts +25 -0
- package/dist/types/epcis.js +0 -0
- package/dist/types/exact-duration-unit.d.ts +8 -0
- package/dist/types/exact-duration-unit.js +0 -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 +22 -11
- package/dist/types/index.d.ts +7 -1
- package/dist/types/index.js +7 -1
- package/dist/types/interval.d.ts +8 -1
- package/dist/types/offset.d.ts +9 -0
- package/dist/types/operating-schedule.d.ts +72 -0
- package/dist/types/operating-schedule.js +0 -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/types/two-digit-year.d.ts +23 -0
- package/dist/types/two-digit-year.js +0 -0
- package/dist/types/zone-bucket-unit.d.ts +1 -1
- package/dist/unix/calculate/addUnix.d.ts +28 -5
- package/dist/unix/calculate/addUnix.js +15 -16
- package/dist/unix/calculate/diffUnix.d.ts +21 -3
- package/dist/unix/calculate/diffUnix.js +12 -9
- package/dist/unix/calculate/diffUnixAsDuration.d.ts +21 -3
- package/dist/unix/calculate/diffUnixAsDuration.js +11 -8
- package/dist/unix/calculate/endOfQuarterForUnix.d.ts +21 -3
- package/dist/unix/calculate/endOfQuarterForUnix.js +7 -3
- package/dist/unix/calculate/endOfUnix.d.ts +29 -4
- package/dist/unix/calculate/endOfUnix.js +8 -4
- package/dist/unix/calculate/isBetweenUnix.d.ts +27 -4
- package/dist/unix/calculate/isBetweenUnix.js +7 -9
- package/dist/unix/calculate/roundUnix.d.ts +39 -3
- package/dist/unix/calculate/roundUnix.js +16 -12
- package/dist/unix/calculate/setUnix.d.ts +58 -12
- package/dist/unix/calculate/setUnix.js +37 -25
- package/dist/unix/calculate/startOfQuarterForUnix.d.ts +21 -3
- package/dist/unix/calculate/startOfQuarterForUnix.js +7 -3
- package/dist/unix/calculate/startOfUnix.d.ts +29 -4
- package/dist/unix/calculate/startOfUnix.js +8 -4
- package/dist/unix/calculate/subtractUnix.d.ts +27 -5
- package/dist/unix/calculate/subtractUnix.js +14 -16
- package/dist/unix/compare/areUnixEqual.d.ts +7 -1
- package/dist/unix/compare/areUnixEqual.js +1 -1
- package/dist/unix/compare/areUnixEqualBy.d.ts +33 -7
- package/dist/unix/compare/areUnixEqualBy.js +20 -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 +17 -4
- package/dist/unix/convert/convertUnixToPlainDate.js +7 -8
- package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +17 -4
- package/dist/unix/convert/convertUnixToPlainDateTime.js +7 -8
- package/dist/unix/convert/convertUnixToPlainTime.d.ts +17 -4
- package/dist/unix/convert/convertUnixToPlainTime.js +7 -8
- package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
- package/dist/unix/convert/convertUnixToUtc.js +3 -4
- package/dist/unix/convert/convertUnixToZoned.d.ts +14 -5
- package/dist/unix/convert/convertUnixToZoned.js +8 -5
- package/dist/unix/format/formatCalendarUnix.d.ts +31 -19
- package/dist/unix/format/formatCalendarUnix.js +10 -6
- package/dist/unix/format/formatRelativeUnix.d.ts +62 -5
- package/dist/unix/format/formatRelativeUnix.js +16 -10
- package/dist/unix/format/formatUnix.d.ts +29 -6
- package/dist/unix/format/formatUnix.js +12 -7
- package/dist/unix/get/getUnixDay.d.ts +1 -3
- package/dist/unix/get/getUnixDay.js +5 -12
- package/dist/unix/get/getUnixHour.d.ts +1 -3
- package/dist/unix/get/getUnixHour.js +5 -12
- package/dist/unix/get/getUnixMicrosecond.d.ts +1 -3
- package/dist/unix/get/getUnixMicrosecond.js +4 -11
- package/dist/unix/get/getUnixMillisecond.d.ts +1 -3
- package/dist/unix/get/getUnixMillisecond.js +5 -12
- package/dist/unix/get/getUnixMinute.d.ts +1 -3
- package/dist/unix/get/getUnixMinute.js +5 -12
- package/dist/unix/get/getUnixMonth.d.ts +1 -3
- package/dist/unix/get/getUnixMonth.js +5 -12
- package/dist/unix/get/getUnixNanosecond.d.ts +1 -3
- package/dist/unix/get/getUnixNanosecond.js +4 -11
- package/dist/unix/get/getUnixNow.d.ts +8 -3
- package/dist/unix/get/getUnixNow.js +1 -3
- package/dist/unix/get/getUnixNowUnit.d.ts +2 -0
- package/dist/unix/get/getUnixNowUnit.js +2 -0
- package/dist/unix/get/getUnixSecond.d.ts +1 -3
- package/dist/unix/get/getUnixSecond.js +5 -12
- package/dist/unix/get/getUnixYear.d.ts +3 -3
- package/dist/unix/get/getUnixYear.js +5 -12
- package/dist/unix/interval/intervalCountUnix.d.ts +23 -5
- package/dist/unix/interval/intervalCountUnix.js +9 -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 +41 -5
- package/dist/unix/interval/intervalFromDurationUnix.js +18 -12
- package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
- package/dist/unix/interval/intervalLengthUnix.d.ts +24 -6
- package/dist/unix/interval/intervalLengthUnix.js +10 -6
- package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +21 -3
- package/dist/unix/interval/intervalOverlappingDaysUnix.js +11 -8
- 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 +50 -11
- package/dist/unix/interval/splitIntervalByUnitUnix.js +33 -22
- package/dist/unix/parse/parseDateFromUnix.d.ts +15 -2
- package/dist/unix/parse/parseDateFromUnix.js +4 -5
- package/dist/unix/parse/parseDayFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseDayFromUnix.js +2 -2
- package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +15 -1
- package/dist/unix/parse/parseDayOfWeekFromUnix.js +3 -3
- package/dist/unix/parse/parseHourFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseHourFromUnix.js +2 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
- package/dist/unix/parse/parseMillisecondFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
- package/dist/unix/parse/parseMinuteFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
- package/dist/unix/parse/parseMonthFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseMonthFromUnix.js +2 -2
- package/dist/unix/parse/parseNanosecondFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
- package/dist/unix/parse/parseSecondFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseSecondFromUnix.js +2 -2
- package/dist/unix/parse/parseTimeFromUnix.d.ts +16 -2
- package/dist/unix/parse/parseTimeFromUnix.js +5 -5
- package/dist/unix/parse/parseUnitFromUnix.d.ts +29 -4
- package/dist/unix/parse/parseUnitFromUnix.js +23 -17
- package/dist/unix/parse/parseWeekFromUnix.d.ts +24 -7
- package/dist/unix/parse/parseWeekFromUnix.js +7 -11
- package/dist/unix/parse/parseYearFromUnix.d.ts +20 -3
- package/dist/unix/parse/parseYearFromUnix.js +6 -3
- package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
- package/dist/unix/validate/isValidUnixRange.js +1 -4
- package/dist/unix/validate/isValidUnixUnit.d.ts +1 -1
- package/dist/utc/calculate/addUtc.d.ts +7 -4
- package/dist/utc/calculate/addUtc.js +5 -11
- 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 +23 -7
- package/dist/utc/calculate/setUtc.js +23 -12
- 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 +5 -11
- package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
- package/dist/utc/compare/areUtcEqualBy.js +2 -3
- package/dist/utc/convert/convertUtcToPlainDate.d.ts +14 -3
- package/dist/utc/convert/convertUtcToPlainDate.js +12 -10
- package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +15 -3
- package/dist/utc/convert/convertUtcToPlainDateTime.js +14 -16
- package/dist/utc/convert/convertUtcToPlainTime.d.ts +11 -3
- package/dist/utc/convert/convertUtcToPlainTime.js +9 -9
- package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
- package/dist/utc/convert/convertUtcToUnix.js +3 -4
- package/dist/utc/convert/convertUtcToZoned.d.ts +5 -1
- package/dist/utc/convert/convertUtcToZoned.js +5 -1
- package/dist/utc/format/formatCalendarUtc.d.ts +23 -8
- package/dist/utc/format/formatCalendarUtc.js +14 -7
- package/dist/utc/format/{formatHttp.d.ts → formatHttpDate.d.ts} +8 -8
- package/dist/utc/format/{formatHttp.js → formatHttpDate.js} +8 -8
- package/dist/utc/format/formatRelativeUtc.d.ts +38 -10
- package/dist/utc/format/formatRelativeUtc.js +22 -16
- package/dist/utc/format/formatUtc.d.ts +22 -15
- package/dist/utc/format/formatUtc.js +12 -8
- package/dist/utc/format/index.d.ts +1 -1
- package/dist/utc/format/index.js +1 -1
- package/dist/utc/get/getUtcDay.d.ts +1 -3
- package/dist/utc/get/getUtcDay.js +5 -12
- package/dist/utc/get/getUtcHour.d.ts +1 -3
- package/dist/utc/get/getUtcHour.js +5 -12
- package/dist/utc/get/getUtcMicrosecond.d.ts +1 -3
- package/dist/utc/get/getUtcMicrosecond.js +4 -11
- package/dist/utc/get/getUtcMillisecond.d.ts +1 -3
- package/dist/utc/get/getUtcMillisecond.js +5 -12
- package/dist/utc/get/getUtcMinute.d.ts +1 -3
- package/dist/utc/get/getUtcMinute.js +5 -12
- package/dist/utc/get/getUtcMonth.d.ts +1 -3
- package/dist/utc/get/getUtcMonth.js +5 -12
- package/dist/utc/get/getUtcNanosecond.d.ts +1 -3
- package/dist/utc/get/getUtcNanosecond.js +4 -11
- package/dist/utc/get/getUtcNow.d.ts +1 -3
- package/dist/utc/get/getUtcNow.js +2 -9
- package/dist/utc/get/getUtcNowUnit.d.ts +2 -0
- package/dist/utc/get/getUtcNowUnit.js +2 -0
- package/dist/utc/get/getUtcSecond.d.ts +1 -3
- package/dist/utc/get/getUtcSecond.js +5 -12
- package/dist/utc/get/getUtcYear.d.ts +3 -3
- package/dist/utc/get/getUtcYear.js +5 -12
- 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/intervalXorAllUtc.js +2 -2
- package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
- package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
- package/dist/utc/interval/mergeIntervalsUtc.js +2 -2
- package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
- package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
- package/dist/utc/parse/index.d.ts +1 -1
- package/dist/utc/parse/index.js +1 -1
- package/dist/utc/parse/parseDateFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseDateFromUtc.js +3 -5
- package/dist/utc/parse/parseDayFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseDayFromUtc.js +3 -5
- package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseDayOfWeekFromUtc.js +5 -7
- package/dist/utc/parse/parseHourFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseHourFromUtc.js +3 -5
- package/dist/utc/parse/{parseHttp.d.ts → parseHttpDate.d.ts} +12 -12
- package/dist/utc/parse/{parseHttp.js → parseHttpDate.js} +12 -12
- package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseMicrosecondFromUtc.js +3 -5
- package/dist/utc/parse/parseMillisecondFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseMillisecondFromUtc.js +3 -5
- package/dist/utc/parse/parseMinuteFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseMinuteFromUtc.js +3 -5
- package/dist/utc/parse/parseMonthFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseMonthFromUtc.js +3 -5
- package/dist/utc/parse/parseNanosecondFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseNanosecondFromUtc.js +3 -5
- package/dist/utc/parse/parseSecondFromUtc.d.ts +9 -3
- package/dist/utc/parse/parseSecondFromUtc.js +3 -5
- package/dist/utc/parse/parseTimeFromUtc.d.ts +11 -3
- package/dist/utc/parse/parseTimeFromUtc.js +7 -7
- package/dist/utc/parse/parseUnitFromUtc.d.ts +25 -6
- package/dist/utc/parse/parseUnitFromUtc.js +14 -10
- package/dist/utc/parse/parseWeekFromUtc.d.ts +20 -10
- package/dist/utc/parse/parseWeekFromUtc.js +8 -14
- package/dist/utc/parse/parseYearFromUtc.d.ts +13 -5
- package/dist/utc/parse/parseYearFromUtc.js +9 -8
- package/dist/utc/validate/index.d.ts +2 -0
- package/dist/utc/validate/index.js +2 -0
- package/dist/utc/validate/isValidHttpDate.d.ts +35 -0
- package/dist/utc/validate/isValidHttpDate.js +38 -0
- package/dist/utc/validate/isValidUtc.d.ts +4 -0
- package/dist/utc/validate/isValidUtc.js +4 -0
- package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
- package/dist/utc/validate/isValidUtcRange.js +2 -5
- package/dist/utc/validate/isValidUtcTimestamp.d.ts +43 -0
- package/dist/utc/validate/isValidUtcTimestamp.js +48 -0
- package/dist/zoned/calculate/addZoned.d.ts +20 -10
- package/dist/zoned/calculate/addZoned.js +10 -20
- 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 +44 -13
- package/dist/zoned/calculate/setZoned.js +30 -21
- 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 +10 -20
- 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 +21 -5
- package/dist/zoned/convert/convertPlainDateTimeToZoned.js +9 -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 +5 -1
- package/dist/zoned/convert/convertZonedToZoned.js +5 -1
- package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
- package/dist/zoned/format/formatCalendarZoned.js +15 -10
- package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
- package/dist/zoned/format/formatRelativeZoned.js +9 -5
- 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 +16 -3
- package/dist/zoned/format/formatTimeZoneName.js +9 -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 +11 -10
- package/dist/zoned/get/getDstTransitions.js +21 -7
- package/dist/zoned/get/getSystemTimeZone.d.ts +3 -1
- package/dist/zoned/get/getSystemTimeZone.js +5 -2
- package/dist/zoned/get/getTimeZoneOffset.d.ts +13 -2
- package/dist/zoned/get/getTimeZoneOffset.js +22 -6
- package/dist/zoned/get/getZonedDay.d.ts +2 -1
- package/dist/zoned/get/getZonedDay.js +6 -7
- package/dist/zoned/get/getZonedDayOfWeek.d.ts +2 -1
- package/dist/zoned/get/getZonedDayOfWeek.js +6 -5
- package/dist/zoned/get/getZonedHour.d.ts +2 -1
- package/dist/zoned/get/getZonedHour.js +6 -7
- package/dist/zoned/get/getZonedMicrosecond.d.ts +2 -1
- package/dist/zoned/get/getZonedMicrosecond.js +6 -5
- package/dist/zoned/get/getZonedMillisecond.d.ts +2 -1
- package/dist/zoned/get/getZonedMillisecond.js +6 -7
- package/dist/zoned/get/getZonedMinute.d.ts +2 -1
- package/dist/zoned/get/getZonedMinute.js +6 -7
- package/dist/zoned/get/getZonedMonth.d.ts +2 -1
- package/dist/zoned/get/getZonedMonth.js +6 -7
- package/dist/zoned/get/getZonedNanosecond.d.ts +2 -1
- package/dist/zoned/get/getZonedNanosecond.js +6 -5
- package/dist/zoned/get/getZonedNow.d.ts +18 -2
- package/dist/zoned/get/getZonedNow.js +17 -4
- package/dist/zoned/get/getZonedNowUnit.d.ts +6 -3
- package/dist/zoned/get/getZonedNowUnit.js +10 -7
- package/dist/zoned/get/getZonedSecond.d.ts +2 -1
- package/dist/zoned/get/getZonedSecond.js +6 -7
- package/dist/zoned/get/getZonedToday.d.ts +2 -1
- package/dist/zoned/get/getZonedToday.js +6 -5
- package/dist/zoned/get/getZonedWeekOfYear.d.ts +2 -1
- package/dist/zoned/get/getZonedWeekOfYear.js +6 -5
- package/dist/zoned/get/getZonedYear.d.ts +4 -1
- package/dist/zoned/get/getZonedYear.js +9 -7
- 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/intervalXorAllZoned.js +2 -2
- package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
- package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
- package/dist/zoned/interval/mergeIntervalsZoned.js +2 -2
- 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 +13 -4
- package/dist/zoned/parse/parseUnitFromZoned.js +6 -4
- package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
- package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
- package/dist/zoned/parse/parseYearFromZoned.d.ts +4 -2
- package/dist/zoned/parse/parseYearFromZoned.js +6 -3
- package/dist/zoned/validate/hasDaylightSaving.d.ts +45 -12
- package/dist/zoned/validate/hasDaylightSaving.js +54 -32
- package/dist/zoned/validate/index.d.ts +2 -0
- package/dist/zoned/validate/index.js +2 -0
- package/dist/zoned/validate/isValidRfc2822DateTime.d.ts +32 -0
- package/dist/zoned/validate/isValidRfc2822DateTime.js +35 -0
- package/dist/zoned/validate/isValidRfc3339DateTime.d.ts +31 -0
- package/dist/zoned/validate/isValidRfc3339DateTime.js +34 -0
- package/dist/zoned/validate/isValidTimeZone.d.ts +5 -1
- package/dist/zoned/validate/isValidTimeZone.js +6 -2
- 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 +67 -5
- package/skills/gmt-arithmetic/SKILL.md +99 -12
- package/skills/gmt-basics/SKILL.md +64 -13
- package/skills/gmt-integration/SKILL.md +33 -13
- package/skills/gmt-timezone/SKILL.md +265 -31
- package/dist/duration/calculate/durationAs.d.ts +0 -62
- package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
- package/dist/internal/resolveReadingTimeZone.js +0 -18
- package/dist/internal/unixZonedDateTime.d.ts +0 -22
- package/dist/internal/unixZonedDateTime.js +0 -32
- package/dist/internal/utcZonedDateTime.d.ts +0 -16
- package/dist/internal/utcZonedDateTime.js +0 -28
- package/dist/types/duration-unit.d.ts +0 -5
- /package/dist/types/{duration-unit.js → duty.js} +0 -0
|
@@ -8,9 +8,14 @@
|
|
|
8
8
|
* optionally followed by a bracketed IANA zone; no leap seconds. Calendar and elective
|
|
9
9
|
* annotations are ignored, as `Temporal.Instant.from` ignores them. The two endpoints need not
|
|
10
10
|
* share a zone.
|
|
11
|
-
* - **
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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 zoned string Temporal wrote is read back as
|
|
15
|
+
* the instant it was written for, except a wall time repeated inside a sub-minute offset
|
|
16
|
+
* change, which reads as its first pass (see `isValidInstant`). Otherwise the bracket is not
|
|
17
|
+
* checked: a zone that does not exist, or that disagrees with the offset, changes nothing. Validity never depends
|
|
18
|
+
* on the bracket.
|
|
14
19
|
* - Order does not matter. A span is signed, not invalid, when `start` is after `end`, so
|
|
15
20
|
* this is symmetric.
|
|
16
21
|
* - **`spanMs` can still return `null` on a pair this accepts** — a span wider than
|
|
@@ -9,9 +9,14 @@ import { parseInstantNanoseconds } from "../../internal/index.js";
|
|
|
9
9
|
* optionally followed by a bracketed IANA zone; no leap seconds. Calendar and elective
|
|
10
10
|
* annotations are ignored, as `Temporal.Instant.from` ignores them. The two endpoints need not
|
|
11
11
|
* share a zone.
|
|
12
|
-
* - **
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
|
|
13
|
+
* written to the minute that is the bracketed zone's sub-minute offset rounded
|
|
14
|
+
* (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
|
|
15
|
+
* `Temporal.ZonedDateTime.from` reads it, so a zoned string Temporal wrote is read back as
|
|
16
|
+
* the instant it was written for, except a wall time repeated inside a sub-minute offset
|
|
17
|
+
* change, which reads as its first pass (see `isValidInstant`). Otherwise the bracket is not
|
|
18
|
+
* checked: a zone that does not exist, or that disagrees with the offset, changes nothing. Validity never depends
|
|
19
|
+
* on the bracket.
|
|
15
20
|
* - Order does not matter. A span is signed, not invalid, when `start` is after `end`, so
|
|
16
21
|
* this is symmetric.
|
|
17
22
|
* - **`spanMs` can still return `null` on a pair this accepts** — a span wider than
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { TimestampClass, TimestampEvent } from "../../types/index.js";
|
|
2
|
+
/** What `bestAvailable` returns: the chosen timestamp and the class it carries. */
|
|
3
|
+
export interface ClassifiedTimestamp {
|
|
4
|
+
/** The chosen event's `at`, exactly as it was written. */
|
|
5
|
+
at: string;
|
|
6
|
+
/** The class of the chosen event, so the value is never shown as something it is not. */
|
|
7
|
+
classifier: TimestampClass;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Pick the best available timestamp for an event from its planned, estimated, requested and
|
|
11
|
+
* actual records, and say which class it is.
|
|
12
|
+
*
|
|
13
|
+
* One field often carries four meanings — DCSA's `eventClassifierCode` vocabulary: `PLN`
|
|
14
|
+
* (planned), `EST` (estimated), `REQ` (requested) and `ACT` (actual). A dashboard that shows the
|
|
15
|
+
* latest-recorded value puts an estimate in the actual column the moment a late feed arrives.
|
|
16
|
+
* This returns the class with the value, so the consumer can label it.
|
|
17
|
+
*
|
|
18
|
+
* - **An `ACT` wins whenever there is one**, whatever was recorded after it: an estimate recorded
|
|
19
|
+
* after the arrival is still only an estimate.
|
|
20
|
+
* - Otherwise `PLN`, then `REQ`, then `EST`. This `ACT` > `PLN` > `REQ` > `EST` selection is GMT's
|
|
21
|
+
* own convention. DCSA's Port Call standard negotiates some port call services — a berth,
|
|
22
|
+
* pilotage, towage — through an estimated, then requested, then planned timestamp, followed by
|
|
23
|
+
* an actual; this order reads that pattern from its most settled end. DCSA defines the classes
|
|
24
|
+
* and the pattern, not a rule for choosing among them. A plan is agreed; a request is asked
|
|
25
|
+
* for; an estimate is only predicted. So an `EST` or `REQ` never replaces a `PLN`, however much later it was recorded,
|
|
26
|
+
* and there is never an `EST` when a `REQ` exists. The order is fixed, not configurable.
|
|
27
|
+
* - Within the chosen class, the newest-recorded event wins (latest `recordedAt`), so a revised
|
|
28
|
+
* plan or a corrected actual replaces the earlier one. Two records at the same instant go to
|
|
29
|
+
* the later one in the array.
|
|
30
|
+
* - `at` is echoed exactly as written. `at` and `recordedAt` are instants (`Z`/offset) or zoned
|
|
31
|
+
* strings, compared as instants and read as `scheduleDeviation` reads them: the offset fixes
|
|
32
|
+
* the instant, and an offset written to the minute that is the bracketed zone's sub-minute
|
|
33
|
+
* offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives.
|
|
34
|
+
* Otherwise the bracket is not checked.
|
|
35
|
+
* - Returns `null` for an empty list, or when any event is invalid — a `classifier` other than
|
|
36
|
+
* exactly `PLN`, `EST`, `REQ` or `ACT` included.
|
|
37
|
+
*
|
|
38
|
+
* @param events the event's timestamp records, in any order
|
|
39
|
+
* @returns the chosen `at` and its class (null for an empty list), or null on invalid input
|
|
40
|
+
*
|
|
41
|
+
* @example bestAvailable([{ classifier: "ACT", at: "2024-06-15T12:52:00Z", recordedAt: "2024-06-15T12:53:00Z" }, { classifier: "EST", at: "2024-06-15T13:05:00Z", recordedAt: "2024-06-15T14:00:00Z" }]) // { at: "2024-06-15T12:52:00Z", classifier: "ACT" } (an estimate recorded after the actual never replaces it)
|
|
42
|
+
* @example bestAvailable([{ classifier: "PLN", at: "2024-06-15T12:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }, { classifier: "PLN", at: "2024-06-15T13:00:00Z", recordedAt: "2024-06-10T00:00:00Z" }]) // { at: "2024-06-15T13:00:00Z", classifier: "PLN" } (the newest plan)
|
|
43
|
+
* @example bestAvailable([{ classifier: "EST", at: "2024-06-15T12:40:00Z", recordedAt: "2024-06-14T00:00:00Z" }, { classifier: "REQ", at: "2024-06-15T12:30:00Z", recordedAt: "2024-06-12T00:00:00Z" }]) // { at: "2024-06-15T12:30:00Z", classifier: "REQ" } (never an EST when a REQ exists)
|
|
44
|
+
* @example bestAvailable([]) // null
|
|
45
|
+
* @example bestAvailable([{ classifier: "ETA", at: "2024-06-15T12:40:00Z", recordedAt: "2024-06-14T00:00:00Z" }]) // null (not a timestamp class)
|
|
46
|
+
*/
|
|
47
|
+
export declare function bestAvailable(events: TimestampEvent[]): ClassifiedTimestamp | null;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { parseTimestampEvents } from "../../internal/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* GMT's selection order: an actual, else a plan, else a request, else an estimate.
|
|
4
|
+
*
|
|
5
|
+
* GMT rule. DCSA defines the four classes (`eventClassifierCode`) and, in its Port Call
|
|
6
|
+
* standard, the pattern some port call services are negotiated through: "an (Estimated,
|
|
7
|
+
* Requested, Planned) ERP-pattern, including an (Actual) A" (DCSA Port Call 2.0.0, Use Cases,
|
|
8
|
+
* "Port Call Services Summary":
|
|
9
|
+
* https://reference.dcsa.org/content/standards/releases/port-call/v2-0-0/port-call-v2-0-0-use-cases).
|
|
10
|
+
* DCSA gives no rule for choosing among the classes; this order reads that pattern from its most
|
|
11
|
+
* settled end.
|
|
12
|
+
*/
|
|
13
|
+
const PRECEDENCE = ["ACT", "PLN", "REQ", "EST"];
|
|
14
|
+
/**
|
|
15
|
+
* Pick the best available timestamp for an event from its planned, estimated, requested and
|
|
16
|
+
* actual records, and say which class it is.
|
|
17
|
+
*
|
|
18
|
+
* One field often carries four meanings — DCSA's `eventClassifierCode` vocabulary: `PLN`
|
|
19
|
+
* (planned), `EST` (estimated), `REQ` (requested) and `ACT` (actual). A dashboard that shows the
|
|
20
|
+
* latest-recorded value puts an estimate in the actual column the moment a late feed arrives.
|
|
21
|
+
* This returns the class with the value, so the consumer can label it.
|
|
22
|
+
*
|
|
23
|
+
* - **An `ACT` wins whenever there is one**, whatever was recorded after it: an estimate recorded
|
|
24
|
+
* after the arrival is still only an estimate.
|
|
25
|
+
* - Otherwise `PLN`, then `REQ`, then `EST`. This `ACT` > `PLN` > `REQ` > `EST` selection is GMT's
|
|
26
|
+
* own convention. DCSA's Port Call standard negotiates some port call services — a berth,
|
|
27
|
+
* pilotage, towage — through an estimated, then requested, then planned timestamp, followed by
|
|
28
|
+
* an actual; this order reads that pattern from its most settled end. DCSA defines the classes
|
|
29
|
+
* and the pattern, not a rule for choosing among them. A plan is agreed; a request is asked
|
|
30
|
+
* for; an estimate is only predicted. So an `EST` or `REQ` never replaces a `PLN`, however much later it was recorded,
|
|
31
|
+
* and there is never an `EST` when a `REQ` exists. The order is fixed, not configurable.
|
|
32
|
+
* - Within the chosen class, the newest-recorded event wins (latest `recordedAt`), so a revised
|
|
33
|
+
* plan or a corrected actual replaces the earlier one. Two records at the same instant go to
|
|
34
|
+
* the later one in the array.
|
|
35
|
+
* - `at` is echoed exactly as written. `at` and `recordedAt` are instants (`Z`/offset) or zoned
|
|
36
|
+
* strings, compared as instants and read as `scheduleDeviation` reads them: the offset fixes
|
|
37
|
+
* the instant, and an offset written to the minute that is the bracketed zone's sub-minute
|
|
38
|
+
* offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives.
|
|
39
|
+
* Otherwise the bracket is not checked.
|
|
40
|
+
* - Returns `null` for an empty list, or when any event is invalid — a `classifier` other than
|
|
41
|
+
* exactly `PLN`, `EST`, `REQ` or `ACT` included.
|
|
42
|
+
*
|
|
43
|
+
* @param events the event's timestamp records, in any order
|
|
44
|
+
* @returns the chosen `at` and its class (null for an empty list), or null on invalid input
|
|
45
|
+
*
|
|
46
|
+
* @example bestAvailable([{ classifier: "ACT", at: "2024-06-15T12:52:00Z", recordedAt: "2024-06-15T12:53:00Z" }, { classifier: "EST", at: "2024-06-15T13:05:00Z", recordedAt: "2024-06-15T14:00:00Z" }]) // { at: "2024-06-15T12:52:00Z", classifier: "ACT" } (an estimate recorded after the actual never replaces it)
|
|
47
|
+
* @example bestAvailable([{ classifier: "PLN", at: "2024-06-15T12:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }, { classifier: "PLN", at: "2024-06-15T13:00:00Z", recordedAt: "2024-06-10T00:00:00Z" }]) // { at: "2024-06-15T13:00:00Z", classifier: "PLN" } (the newest plan)
|
|
48
|
+
* @example bestAvailable([{ classifier: "EST", at: "2024-06-15T12:40:00Z", recordedAt: "2024-06-14T00:00:00Z" }, { classifier: "REQ", at: "2024-06-15T12:30:00Z", recordedAt: "2024-06-12T00:00:00Z" }]) // { at: "2024-06-15T12:30:00Z", classifier: "REQ" } (never an EST when a REQ exists)
|
|
49
|
+
* @example bestAvailable([]) // null
|
|
50
|
+
* @example bestAvailable([{ classifier: "ETA", at: "2024-06-15T12:40:00Z", recordedAt: "2024-06-14T00:00:00Z" }]) // null (not a timestamp class)
|
|
51
|
+
*/
|
|
52
|
+
export function bestAvailable(events) {
|
|
53
|
+
try {
|
|
54
|
+
const parsed = parseTimestampEvents(events);
|
|
55
|
+
if (parsed === null) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
// `parsed` is in recording order, so the last event of a class is its newest record.
|
|
59
|
+
const newest = new Map();
|
|
60
|
+
for (const event of parsed) {
|
|
61
|
+
newest.set(event.classifier, event.at);
|
|
62
|
+
}
|
|
63
|
+
for (const classifier of PRECEDENCE) {
|
|
64
|
+
const at = newest.get(classifier);
|
|
65
|
+
if (at !== undefined) {
|
|
66
|
+
return { at, classifier };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Never throws (Core Rule 3): a hostile
|
|
73
|
+
// argument is invalid input, not an exception.
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** What `crossingTime` returns: exact elapsed time plus the local view at either end. */
|
|
2
|
+
export interface Crossing {
|
|
3
|
+
/**
|
|
4
|
+
* The exact elapsed time from entry to exit, as an ISO 8601 duration with hours as the largest
|
|
5
|
+
* unit.
|
|
6
|
+
*/
|
|
7
|
+
duration: string;
|
|
8
|
+
/** The entry, rendered in the target zone. */
|
|
9
|
+
enter: string;
|
|
10
|
+
/** The exit, rendered in the target zone. */
|
|
11
|
+
exit: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Measure a crossing — a canal transit, a strait passage, a border queue — and render both ends
|
|
15
|
+
* in the zone the crossing is administered in.
|
|
16
|
+
*
|
|
17
|
+
* A crossing is logged as two instants, and the authority that schedules it reads both on its
|
|
18
|
+
* own clock. `crossingTime` returns the exact elapsed time between them plus the zone-local
|
|
19
|
+
* entry and exit. It deliberately counts no calendar days: dwell charged by local days
|
|
20
|
+
* (`calendarDays`) is `dwellTime`'s job, and a crossing that needs a day count is a dwell.
|
|
21
|
+
*
|
|
22
|
+
* - **`duration` is exact elapsed time.** A crossing spanning a DST transition reports the hours
|
|
23
|
+
* that actually elapsed; the local wall clocks at either end can be an hour apart from that.
|
|
24
|
+
* Hours is the largest unit, so the value never depends on a calendar.
|
|
25
|
+
* - **`targetZone` is always the rendering zone.** `entry` and `exit` are anything
|
|
26
|
+
* `isValidInstant` accepts — `Z`, an offset, or an offset with a bracketed zone — and only the
|
|
27
|
+
* instant is read: a bracketed zone in the input is never the zone the result is rendered
|
|
28
|
+
* in. That is the one contract difference from `dwellTime`, whose zone may come from its
|
|
29
|
+
* entry's bracket.
|
|
30
|
+
* - **The offset fixes each instant; a bracketed zone only resolves a rounded one.** An offset
|
|
31
|
+
* written to the minute that is the bracketed zone's sub-minute offset rounded
|
|
32
|
+
* (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
|
|
33
|
+
* `Temporal.ZonedDateTime.from` reads it. A zone that does not exist, or that disagrees with
|
|
34
|
+
* the offset, is not checked and changes nothing.
|
|
35
|
+
* - `targetZone` is whatever `isValidTimeZone` accepts, which is what Temporal accepts: an IANA
|
|
36
|
+
* identifier, or a fixed offset such as `"+02:00"`, which observes no DST.
|
|
37
|
+
* - GMT does not resolve a canal, lock or checkpoint code to a zone; the caller supplies the
|
|
38
|
+
* identifier.
|
|
39
|
+
* - Returns `null` when either instant is invalid, when `exit` is before `entry` (an inverted
|
|
40
|
+
* crossing is a data error, not a negative transit), or when the zone is invalid. A zero-length
|
|
41
|
+
* crossing is `PT0S`.
|
|
42
|
+
* - An offset with seconds (`-00:44:30`) returns `null`. A written zone cannot carry seconds (RFC
|
|
43
|
+
* 9557 §4.1), so the result could not name it. Pass the IANA name, or call
|
|
44
|
+
* `fromOffsetInstant({ instant, offset })` for the local time with its full offset and no
|
|
45
|
+
* bracket.
|
|
46
|
+
*
|
|
47
|
+
* @param entry ISO 8601 zoned datetime or instant string of entering the crossing
|
|
48
|
+
* @param exit ISO 8601 zoned datetime or instant string of leaving it
|
|
49
|
+
* @param targetZone IANA name or a UTC offset to the minute (what `isValidTimeZone` accepts) the
|
|
50
|
+
* crossing is read in
|
|
51
|
+
* @returns exact duration and zone-local entry and exit, or null on invalid input
|
|
52
|
+
*
|
|
53
|
+
* @example crossingTime("2024-06-15T08:00:00Z", "2024-06-15T17:30:00Z", "Europe/Berlin") // { duration: "PT9H30M", enter: "2024-06-15T10:00:00+02:00[Europe/Berlin]", exit: "2024-06-15T19:30:00+02:00[Europe/Berlin]" }
|
|
54
|
+
* @example crossingTime("2024-06-15T10:00:00+09:00", "2024-06-15T12:00:00+09:00", "Asia/Tokyo") // { duration: "PT2H", enter: "2024-06-15T10:00:00+09:00[Asia/Tokyo]", exit: "2024-06-15T12:00:00+09:00[Asia/Tokyo]" }
|
|
55
|
+
* @example crossingTime("2024-03-10T05:00:00Z", "2024-03-10T12:00:00Z", "America/New_York") // { duration: "PT7H", enter: "2024-03-10T00:00:00-05:00[America/New_York]", exit: "2024-03-10T08:00:00-04:00[America/New_York]" } (seven elapsed hours across the spring-forward)
|
|
56
|
+
* @example crossingTime("2024-11-03T05:30:00Z", "2024-11-03T06:30:00Z", "America/New_York") // { duration: "PT1H", enter: "2024-11-03T01:30:00-04:00[America/New_York]", exit: "2024-11-03T01:30:00-05:00[America/New_York]" } (both ends read 01:30; the offsets tell them apart)
|
|
57
|
+
* @example crossingTime("2024-06-15T10:00:00Z", "2024-06-15T10:00:00Z", "Asia/Tokyo") // { duration: "PT0S", enter: "2024-06-15T19:00:00+09:00[Asia/Tokyo]", exit: "2024-06-15T19:00:00+09:00[Asia/Tokyo]" }
|
|
58
|
+
* @example crossingTime("2024-06-15T22:30:00Z", "2024-06-16T01:00:00Z", "+02:00") // { duration: "PT2H30M", enter: "2024-06-16T00:30:00+02:00[+02:00]", exit: "2024-06-16T03:00:00+02:00[+02:00]" } (a fixed offset renders with no DST)
|
|
59
|
+
* @example crossingTime("2024-06-16T01:00:00Z", "2024-06-15T22:30:00Z", "Europe/London") // null (exit before entry)
|
|
60
|
+
* @example crossingTime("2024-06-15T22:30:00Z", "2024-06-16T01:00:00Z", "Europe/Londres") // null
|
|
61
|
+
* @example crossingTime("2024-06-15T22:30:00", "2024-06-16T01:00:00Z", "Europe/London") // null (no offset designator: not a moment)
|
|
62
|
+
*/
|
|
63
|
+
export declare function crossingTime(entry: string, exit: string, targetZone: string): Crossing | null;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { instantFrom } from "../../internal/index.js";
|
|
3
|
+
import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
4
|
+
import { isValidTimeZone } from "../../zoned/validate/isValidTimeZone.js";
|
|
5
|
+
/**
|
|
6
|
+
* Measure a crossing — a canal transit, a strait passage, a border queue — and render both ends
|
|
7
|
+
* in the zone the crossing is administered in.
|
|
8
|
+
*
|
|
9
|
+
* A crossing is logged as two instants, and the authority that schedules it reads both on its
|
|
10
|
+
* own clock. `crossingTime` returns the exact elapsed time between them plus the zone-local
|
|
11
|
+
* entry and exit. It deliberately counts no calendar days: dwell charged by local days
|
|
12
|
+
* (`calendarDays`) is `dwellTime`'s job, and a crossing that needs a day count is a dwell.
|
|
13
|
+
*
|
|
14
|
+
* - **`duration` is exact elapsed time.** A crossing spanning a DST transition reports the hours
|
|
15
|
+
* that actually elapsed; the local wall clocks at either end can be an hour apart from that.
|
|
16
|
+
* Hours is the largest unit, so the value never depends on a calendar.
|
|
17
|
+
* - **`targetZone` is always the rendering zone.** `entry` and `exit` are anything
|
|
18
|
+
* `isValidInstant` accepts — `Z`, an offset, or an offset with a bracketed zone — and only the
|
|
19
|
+
* instant is read: a bracketed zone in the input is never the zone the result is rendered
|
|
20
|
+
* in. That is the one contract difference from `dwellTime`, whose zone may come from its
|
|
21
|
+
* entry's bracket.
|
|
22
|
+
* - **The offset fixes each instant; a bracketed zone only resolves a rounded one.** An offset
|
|
23
|
+
* written to the minute that is the bracketed zone's sub-minute offset rounded
|
|
24
|
+
* (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
|
|
25
|
+
* `Temporal.ZonedDateTime.from` reads it. A zone that does not exist, or that disagrees with
|
|
26
|
+
* the offset, is not checked and changes nothing.
|
|
27
|
+
* - `targetZone` is whatever `isValidTimeZone` accepts, which is what Temporal accepts: an IANA
|
|
28
|
+
* identifier, or a fixed offset such as `"+02:00"`, which observes no DST.
|
|
29
|
+
* - GMT does not resolve a canal, lock or checkpoint code to a zone; the caller supplies the
|
|
30
|
+
* identifier.
|
|
31
|
+
* - Returns `null` when either instant is invalid, when `exit` is before `entry` (an inverted
|
|
32
|
+
* crossing is a data error, not a negative transit), or when the zone is invalid. A zero-length
|
|
33
|
+
* crossing is `PT0S`.
|
|
34
|
+
* - An offset with seconds (`-00:44:30`) returns `null`. A written zone cannot carry seconds (RFC
|
|
35
|
+
* 9557 §4.1), so the result could not name it. Pass the IANA name, or call
|
|
36
|
+
* `fromOffsetInstant({ instant, offset })` for the local time with its full offset and no
|
|
37
|
+
* bracket.
|
|
38
|
+
*
|
|
39
|
+
* @param entry ISO 8601 zoned datetime or instant string of entering the crossing
|
|
40
|
+
* @param exit ISO 8601 zoned datetime or instant string of leaving it
|
|
41
|
+
* @param targetZone IANA name or a UTC offset to the minute (what `isValidTimeZone` accepts) the
|
|
42
|
+
* crossing is read in
|
|
43
|
+
* @returns exact duration and zone-local entry and exit, or null on invalid input
|
|
44
|
+
*
|
|
45
|
+
* @example crossingTime("2024-06-15T08:00:00Z", "2024-06-15T17:30:00Z", "Europe/Berlin") // { duration: "PT9H30M", enter: "2024-06-15T10:00:00+02:00[Europe/Berlin]", exit: "2024-06-15T19:30:00+02:00[Europe/Berlin]" }
|
|
46
|
+
* @example crossingTime("2024-06-15T10:00:00+09:00", "2024-06-15T12:00:00+09:00", "Asia/Tokyo") // { duration: "PT2H", enter: "2024-06-15T10:00:00+09:00[Asia/Tokyo]", exit: "2024-06-15T12:00:00+09:00[Asia/Tokyo]" }
|
|
47
|
+
* @example crossingTime("2024-03-10T05:00:00Z", "2024-03-10T12:00:00Z", "America/New_York") // { duration: "PT7H", enter: "2024-03-10T00:00:00-05:00[America/New_York]", exit: "2024-03-10T08:00:00-04:00[America/New_York]" } (seven elapsed hours across the spring-forward)
|
|
48
|
+
* @example crossingTime("2024-11-03T05:30:00Z", "2024-11-03T06:30:00Z", "America/New_York") // { duration: "PT1H", enter: "2024-11-03T01:30:00-04:00[America/New_York]", exit: "2024-11-03T01:30:00-05:00[America/New_York]" } (both ends read 01:30; the offsets tell them apart)
|
|
49
|
+
* @example crossingTime("2024-06-15T10:00:00Z", "2024-06-15T10:00:00Z", "Asia/Tokyo") // { duration: "PT0S", enter: "2024-06-15T19:00:00+09:00[Asia/Tokyo]", exit: "2024-06-15T19:00:00+09:00[Asia/Tokyo]" }
|
|
50
|
+
* @example crossingTime("2024-06-15T22:30:00Z", "2024-06-16T01:00:00Z", "+02:00") // { duration: "PT2H30M", enter: "2024-06-16T00:30:00+02:00[+02:00]", exit: "2024-06-16T03:00:00+02:00[+02:00]" } (a fixed offset renders with no DST)
|
|
51
|
+
* @example crossingTime("2024-06-16T01:00:00Z", "2024-06-15T22:30:00Z", "Europe/London") // null (exit before entry)
|
|
52
|
+
* @example crossingTime("2024-06-15T22:30:00Z", "2024-06-16T01:00:00Z", "Europe/Londres") // null
|
|
53
|
+
* @example crossingTime("2024-06-15T22:30:00", "2024-06-16T01:00:00Z", "Europe/London") // null (no offset designator: not a moment)
|
|
54
|
+
*/
|
|
55
|
+
export function crossingTime(entry, exit, targetZone) {
|
|
56
|
+
try {
|
|
57
|
+
// fallow-ignore-next-line code-duplication -- not delegated to dwellTime: its transition walk returns null past 10,000 transitions, a false null for a long crossing, and its calendar-day count is work crossingTime does not use
|
|
58
|
+
if (!isValidInstant(entry) ||
|
|
59
|
+
!isValidInstant(exit) ||
|
|
60
|
+
!isValidTimeZone(targetZone)) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
const entryInstant = instantFrom(entry);
|
|
64
|
+
const exitInstant = instantFrom(exit);
|
|
65
|
+
if (Temporal.Instant.compare(entryInstant, exitInstant) > 0) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
duration: entryInstant
|
|
70
|
+
.until(exitInstant, { largestUnit: "hours" })
|
|
71
|
+
.toString(),
|
|
72
|
+
enter: entryInstant.toZonedDateTimeISO(targetZone).toString(),
|
|
73
|
+
exit: exitInstant.toZonedDateTimeISO(targetZone).toString(),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Never throws (Core Rule 3): a hostile
|
|
78
|
+
// argument is invalid input, not an exception.
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { BusinessCalendar, RollConvention } from "../../types/index.js";
|
|
2
|
+
/** Options for `cutoffAt`. */
|
|
3
|
+
export interface CutoffOptions {
|
|
4
|
+
/**
|
|
5
|
+
* The time zone the cut-off is read in, the terminal's clock: an IANA name or a UTC offset to the
|
|
6
|
+
* minute (what `isValidTimeZone` accepts).
|
|
7
|
+
*/
|
|
8
|
+
timeZone: string;
|
|
9
|
+
/**
|
|
10
|
+
* The local time of day the cut-off is pinned to (`"17:00"`), as `isValidTime` accepts.
|
|
11
|
+
*
|
|
12
|
+
* @defaultValue None. The cut-off is the offset taken off the anchor, with no time of day
|
|
13
|
+
* pinned.
|
|
14
|
+
*/
|
|
15
|
+
atLocalTime?: string;
|
|
16
|
+
/**
|
|
17
|
+
* The working week and holidays the cut-off's local date is rolled against. Its `timeZone` is
|
|
18
|
+
* not read: `timeZone` above is the local frame. Requires `roll`.
|
|
19
|
+
*
|
|
20
|
+
* @defaultValue None. The cut-off's date is not rolled; a `roll` without it returns `""`.
|
|
21
|
+
*/
|
|
22
|
+
calendar?: BusinessCalendar;
|
|
23
|
+
/**
|
|
24
|
+
* How a cut-off on a non-business day moves, as `rollDate` moves it. Requires `calendar`.
|
|
25
|
+
*
|
|
26
|
+
* @defaultValue None. The cut-off's date is not rolled; a `calendar` without it returns `""`.
|
|
27
|
+
*/
|
|
28
|
+
roll?: RollConvention;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Find a deadline stated as an offset before an anchor event, in the local time of the place
|
|
32
|
+
* that enforces it.
|
|
33
|
+
*
|
|
34
|
+
* Logistics deadlines are not fixed timestamps: they count back from an event — a vessel's
|
|
35
|
+
* departure, a flight's, a container's loading — and they move when that event moves. An ocean
|
|
36
|
+
* booking carries a stack of them (documentation, VGM, gate-in, customs); `cutoffSchedule`
|
|
37
|
+
* computes the whole stack at once.
|
|
38
|
+
*
|
|
39
|
+
* - **`atLocalTime` is what makes this more than subtracting a duration.** A cut-off "two days
|
|
40
|
+
* before, 17:00" is 17:00 local on the date two days earlier — not 48 hours before, which
|
|
41
|
+
* keeps the departure's time of day, and moves by an hour when a DST transition falls in
|
|
42
|
+
* between. With `atLocalTime` only the day of the offset result matters: the offset's exact
|
|
43
|
+
* part (hours and smaller) comes off the anchor's instant, its calendar part (years, months,
|
|
44
|
+
* weeks, days) off that local date, and the cut-off is `atLocalTime` on the day it lands on.
|
|
45
|
+
* Because the exact part is taken off before the day is found, it can change the day: from
|
|
46
|
+
* midnight, `P2DT0.000000001S` lands a day earlier than `P2D`.
|
|
47
|
+
* - **Without `atLocalTime` the offset is taken off as Temporal's `ZonedDateTime#subtract`
|
|
48
|
+
* takes it:** the calendar part moves the local wall clock — `P2D` from 18:00 is 18:00, 47,
|
|
49
|
+
* 48 or 49 hours earlier — and the exact part is exact elapsed time — `PT96H` is 96 hours,
|
|
50
|
+
* whatever the clock does. This is the advance-filing shape.
|
|
51
|
+
* - **The anchor is the caller's event.** Loading, departure and arrival are different
|
|
52
|
+
* instants, and the same offset from the wrong one is late by days. `cutoffAt` never guesses
|
|
53
|
+
* which event a rule means. The anchor is exact: an instant (`Z`/offset) or a zoned string.
|
|
54
|
+
* Its bracket never supplies the zone — `timeZone` alone is the local frame — and is not
|
|
55
|
+
* checked, with one exception: an offset written to the minute that is the bracketed zone's
|
|
56
|
+
* sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the
|
|
57
|
+
* zone gives, as `Temporal.ZonedDateTime.from` reads it. The anchor is not cached: a
|
|
58
|
+
* rescheduled departure is a new call.
|
|
59
|
+
* - **Non-business days roll as the caller says.** With `calendar`, a cut-off on a weekend or
|
|
60
|
+
* holiday moves by `roll`, as `rollDate` moves it. Every industry answers "what if it lands
|
|
61
|
+
* on a non-working day" differently, so the convention is always explicit — there is no
|
|
62
|
+
* default: `calendar` without `roll`, or `roll` without `calendar`, returns `""`. The rolled
|
|
63
|
+
* day keeps the cut-off's local time of day. `calendar.timeZone` is not read; `timeZone` is
|
|
64
|
+
* the local frame. `"endOfMonth"` is `rollDate`'s schedule tool, not a cut-off convention.
|
|
65
|
+
* - **The order is not checked.** `cutoffAt` does not check that the cut-off comes before the
|
|
66
|
+
* anchor: a negative offset, `P0D` with a late `atLocalTime`, `"following"` or `"endOfMonth"`
|
|
67
|
+
* can each put it after.
|
|
68
|
+
* - **Local-time resolution.** Every local wall time the cut-off lands on — `atLocalTime`, the
|
|
69
|
+
* calendar part of an unpinned offset, a rolled day — is resolved as `resolveLocal` describes
|
|
70
|
+
* it: an **ambiguous** wall time (a fall-back hour the clock ran through twice) takes the
|
|
71
|
+
* **earlier** instant — RFC 5545 §3.3.5's "first occurrence of the referenced time" — and a
|
|
72
|
+
* **nonexistent** one (a skipped hour, a deleted day) returns `""` rather than being
|
|
73
|
+
* shifted. An exact result that is not re-resolved stays as it is.
|
|
74
|
+
* - Returns the cut-off as a zoned string in `timeZone`, or `""` on invalid input.
|
|
75
|
+
* - An offset with seconds (`-00:44:30`) returns `""`. A written zone cannot carry seconds (RFC
|
|
76
|
+
* 9557 §4.1), so the result could not name it. Pass the IANA name.
|
|
77
|
+
*
|
|
78
|
+
* @param anchor ISO 8601 instant or zoned datetime string of the event the deadline counts back from
|
|
79
|
+
* @param offset ISO 8601 duration before the anchor
|
|
80
|
+
* @param options The zone the cut-off is read in, the time of day it is pinned to, and how it rolls off a non-business day
|
|
81
|
+
* @returns ISO 8601 zoned datetime string of the cut-off, or "" on invalid input
|
|
82
|
+
*
|
|
83
|
+
* @example cutoffAt("2024-06-14T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00" }) // "2024-06-12T17:00:00+02:00[Europe/Amsterdam]"
|
|
84
|
+
* @example cutoffAt("2024-06-14T16:00:00Z", "PT48H", { timeZone: "Europe/Amsterdam" }) // "2024-06-12T18:00:00+02:00[Europe/Amsterdam]" (48 hours keeps the departure's 18:00)
|
|
85
|
+
* @example cutoffAt("2024-06-14T16:00:00Z", "P1D", { timeZone: "Europe/Amsterdam", atLocalTime: "10:00" }) // "2024-06-13T10:00:00+02:00[Europe/Amsterdam]"
|
|
86
|
+
* @example cutoffAt("2024-11-05T17:00:00Z", "PT96H", { timeZone: "America/New_York" }) // "2024-11-01T13:00:00-04:00[America/New_York]" (96 elapsed hours across the fall-back)
|
|
87
|
+
* @example cutoffAt("2024-03-11T22:00:00Z", "P2D", { timeZone: "America/New_York", atLocalTime: "17:00" }) // "2024-03-09T17:00:00-05:00[America/New_York]" (17:00 local, across the spring-forward)
|
|
88
|
+
* @example cutoffAt("2024-06-18T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00", calendar: { weekend: [6, 7], holidays: [], timeZone: "Europe/Amsterdam" }, roll: "preceding" }) // "2024-06-14T17:00:00+02:00[Europe/Amsterdam]" (Sunday rolls back to Friday)
|
|
89
|
+
* @example cutoffAt("2024-06-18T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00", calendar: { weekend: [6, 7], holidays: [], timeZone: "Europe/Amsterdam" } }) // "" (a calendar needs a roll convention)
|
|
90
|
+
* @example cutoffAt("2024-11-04T23:00:00Z", "P1D", { timeZone: "America/New_York", atLocalTime: "01:30" }) // "2024-11-03T01:30:00-04:00[America/New_York]" (a repeated hour takes the earlier pass)
|
|
91
|
+
* @example cutoffAt("2024-03-11T22:00:00Z", "P1D", { timeZone: "America/New_York", atLocalTime: "02:30" }) // "" (02:30 on 10 March never happened)
|
|
92
|
+
* @example cutoffAt("2024-06-14T18:00:00", "P2D", { timeZone: "Europe/Amsterdam" }) // "" (a zoneless anchor is not a moment)
|
|
93
|
+
* @example cutoffAt("2024-06-14T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", roll: "preceding" }) // "" (a roll needs a calendar)
|
|
94
|
+
*/
|
|
95
|
+
export declare function cutoffAt(anchor: string, offset: string, options: CutoffOptions): string;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { rollDate } from "../../calendar/business/rollDate.js";
|
|
3
|
+
import { isValidBusinessCalendar } from "../../calendar/validate/isValidBusinessCalendar.js";
|
|
4
|
+
import { isValidRollConvention } from "../../calendar/validate/isValidRollConvention.js";
|
|
5
|
+
import { isValidDuration } from "../../duration/validate/isValidDuration.js";
|
|
6
|
+
import { classifyLocal } from "../../instant/convert/classifyLocal.js";
|
|
7
|
+
import { resolveLocal } from "../../instant/convert/resolveLocal.js";
|
|
8
|
+
import { instantFrom } from "../../internal/index.js";
|
|
9
|
+
import { isObject } from "../../internal/isObject.js";
|
|
10
|
+
import { isValidTime } from "../../plain/validate/isValidTime.js";
|
|
11
|
+
import { isValidInstant } from "../../precision/validate/isValidInstant.js";
|
|
12
|
+
import { isValidTimeZone } from "../../zoned/validate/isValidTimeZone.js";
|
|
13
|
+
function resolveOptions(options) {
|
|
14
|
+
if (!isObject(options)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const { timeZone, atLocalTime, calendar, roll } = options;
|
|
18
|
+
if (typeof timeZone !== "string" || !isValidTimeZone(timeZone)) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
if (atLocalTime !== undefined && !isValidTime(atLocalTime)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
if (calendar !== undefined && !isValidBusinessCalendar(calendar)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
if (roll !== undefined && !isValidRollConvention(roll)) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
// Rolling needs both a calendar and a direction, and no standard supplies either one by
|
|
31
|
+
// default: a calendar without a roll, or a roll without a calendar, is a missing term.
|
|
32
|
+
if ((calendar === undefined) !== (roll === undefined)) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
timeZone,
|
|
37
|
+
atLocalTime: atLocalTime === undefined ? null : Temporal.PlainTime.from(atLocalTime),
|
|
38
|
+
rolling: calendar === undefined || roll === undefined ? null : { calendar, roll },
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The instant a local wall time names: the first occurrence of a repeated hour, as RFC 5545
|
|
43
|
+
* §3.3.5 reads a local time that "occurs more than once", and `null` for a skipped one, which
|
|
44
|
+
* is never shifted.
|
|
45
|
+
*/
|
|
46
|
+
function resolveWallTime(wall, timeZone) {
|
|
47
|
+
const local = wall.toString();
|
|
48
|
+
const kind = classifyLocal(local, timeZone);
|
|
49
|
+
if (kind === null || kind === "nonexistent") {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const instant = resolveLocal(local, timeZone, { disambiguation: "earlier" });
|
|
53
|
+
return instant === ""
|
|
54
|
+
? null
|
|
55
|
+
: Temporal.Instant.from(instant).toZonedDateTimeISO(timeZone);
|
|
56
|
+
}
|
|
57
|
+
/** The calendar part of a duration — years, months, weeks and days. */
|
|
58
|
+
function datePart(offset) {
|
|
59
|
+
return Temporal.Duration.from({
|
|
60
|
+
years: offset.years,
|
|
61
|
+
months: offset.months,
|
|
62
|
+
weeks: offset.weeks,
|
|
63
|
+
days: offset.days,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** The exact part of a duration — hours and smaller. */
|
|
67
|
+
function timePart(offset) {
|
|
68
|
+
return Temporal.Duration.from({
|
|
69
|
+
hours: offset.hours,
|
|
70
|
+
minutes: offset.minutes,
|
|
71
|
+
seconds: offset.seconds,
|
|
72
|
+
milliseconds: offset.milliseconds,
|
|
73
|
+
microseconds: offset.microseconds,
|
|
74
|
+
nanoseconds: offset.nanoseconds,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The offset taken off the anchor with no pinning: the calendar part moves the local wall
|
|
79
|
+
* clock, then the exact part comes off in exact time — Temporal's `ZonedDateTime#subtract`,
|
|
80
|
+
* except that a wall clock landing in a skipped hour is `null` rather than moved forward.
|
|
81
|
+
*/
|
|
82
|
+
function subtractOffset(anchor, offset) {
|
|
83
|
+
const calendarPart = datePart(offset);
|
|
84
|
+
if (calendarPart.blank) {
|
|
85
|
+
return anchor.subtract(timePart(offset));
|
|
86
|
+
}
|
|
87
|
+
const wall = resolveWallTime(anchor.toPlainDateTime().subtract(calendarPart), anchor.timeZoneId);
|
|
88
|
+
return wall === null ? null : wall.subtract(timePart(offset));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The local date the cut-off falls on after rolling, or `null` when the roll fails. With no
|
|
92
|
+
* calendar the date is left as it is.
|
|
93
|
+
*/
|
|
94
|
+
function rolledDate(date, options) {
|
|
95
|
+
if (options.rolling === null) {
|
|
96
|
+
return date;
|
|
97
|
+
}
|
|
98
|
+
const { calendar, roll } = options.rolling;
|
|
99
|
+
const rolled = rollDate(date.toString(), roll, calendar);
|
|
100
|
+
return rolled === "" ? null : Temporal.PlainDate.from(rolled);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Find a deadline stated as an offset before an anchor event, in the local time of the place
|
|
104
|
+
* that enforces it.
|
|
105
|
+
*
|
|
106
|
+
* Logistics deadlines are not fixed timestamps: they count back from an event — a vessel's
|
|
107
|
+
* departure, a flight's, a container's loading — and they move when that event moves. An ocean
|
|
108
|
+
* booking carries a stack of them (documentation, VGM, gate-in, customs); `cutoffSchedule`
|
|
109
|
+
* computes the whole stack at once.
|
|
110
|
+
*
|
|
111
|
+
* - **`atLocalTime` is what makes this more than subtracting a duration.** A cut-off "two days
|
|
112
|
+
* before, 17:00" is 17:00 local on the date two days earlier — not 48 hours before, which
|
|
113
|
+
* keeps the departure's time of day, and moves by an hour when a DST transition falls in
|
|
114
|
+
* between. With `atLocalTime` only the day of the offset result matters: the offset's exact
|
|
115
|
+
* part (hours and smaller) comes off the anchor's instant, its calendar part (years, months,
|
|
116
|
+
* weeks, days) off that local date, and the cut-off is `atLocalTime` on the day it lands on.
|
|
117
|
+
* Because the exact part is taken off before the day is found, it can change the day: from
|
|
118
|
+
* midnight, `P2DT0.000000001S` lands a day earlier than `P2D`.
|
|
119
|
+
* - **Without `atLocalTime` the offset is taken off as Temporal's `ZonedDateTime#subtract`
|
|
120
|
+
* takes it:** the calendar part moves the local wall clock — `P2D` from 18:00 is 18:00, 47,
|
|
121
|
+
* 48 or 49 hours earlier — and the exact part is exact elapsed time — `PT96H` is 96 hours,
|
|
122
|
+
* whatever the clock does. This is the advance-filing shape.
|
|
123
|
+
* - **The anchor is the caller's event.** Loading, departure and arrival are different
|
|
124
|
+
* instants, and the same offset from the wrong one is late by days. `cutoffAt` never guesses
|
|
125
|
+
* which event a rule means. The anchor is exact: an instant (`Z`/offset) or a zoned string.
|
|
126
|
+
* Its bracket never supplies the zone — `timeZone` alone is the local frame — and is not
|
|
127
|
+
* checked, with one exception: an offset written to the minute that is the bracketed zone's
|
|
128
|
+
* sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the
|
|
129
|
+
* zone gives, as `Temporal.ZonedDateTime.from` reads it. The anchor is not cached: a
|
|
130
|
+
* rescheduled departure is a new call.
|
|
131
|
+
* - **Non-business days roll as the caller says.** With `calendar`, a cut-off on a weekend or
|
|
132
|
+
* holiday moves by `roll`, as `rollDate` moves it. Every industry answers "what if it lands
|
|
133
|
+
* on a non-working day" differently, so the convention is always explicit — there is no
|
|
134
|
+
* default: `calendar` without `roll`, or `roll` without `calendar`, returns `""`. The rolled
|
|
135
|
+
* day keeps the cut-off's local time of day. `calendar.timeZone` is not read; `timeZone` is
|
|
136
|
+
* the local frame. `"endOfMonth"` is `rollDate`'s schedule tool, not a cut-off convention.
|
|
137
|
+
* - **The order is not checked.** `cutoffAt` does not check that the cut-off comes before the
|
|
138
|
+
* anchor: a negative offset, `P0D` with a late `atLocalTime`, `"following"` or `"endOfMonth"`
|
|
139
|
+
* can each put it after.
|
|
140
|
+
* - **Local-time resolution.** Every local wall time the cut-off lands on — `atLocalTime`, the
|
|
141
|
+
* calendar part of an unpinned offset, a rolled day — is resolved as `resolveLocal` describes
|
|
142
|
+
* it: an **ambiguous** wall time (a fall-back hour the clock ran through twice) takes the
|
|
143
|
+
* **earlier** instant — RFC 5545 §3.3.5's "first occurrence of the referenced time" — and a
|
|
144
|
+
* **nonexistent** one (a skipped hour, a deleted day) returns `""` rather than being
|
|
145
|
+
* shifted. An exact result that is not re-resolved stays as it is.
|
|
146
|
+
* - Returns the cut-off as a zoned string in `timeZone`, or `""` on invalid input.
|
|
147
|
+
* - An offset with seconds (`-00:44:30`) returns `""`. A written zone cannot carry seconds (RFC
|
|
148
|
+
* 9557 §4.1), so the result could not name it. Pass the IANA name.
|
|
149
|
+
*
|
|
150
|
+
* @param anchor ISO 8601 instant or zoned datetime string of the event the deadline counts back from
|
|
151
|
+
* @param offset ISO 8601 duration before the anchor
|
|
152
|
+
* @param options The zone the cut-off is read in, the time of day it is pinned to, and how it rolls off a non-business day
|
|
153
|
+
* @returns ISO 8601 zoned datetime string of the cut-off, or "" on invalid input
|
|
154
|
+
*
|
|
155
|
+
* @example cutoffAt("2024-06-14T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00" }) // "2024-06-12T17:00:00+02:00[Europe/Amsterdam]"
|
|
156
|
+
* @example cutoffAt("2024-06-14T16:00:00Z", "PT48H", { timeZone: "Europe/Amsterdam" }) // "2024-06-12T18:00:00+02:00[Europe/Amsterdam]" (48 hours keeps the departure's 18:00)
|
|
157
|
+
* @example cutoffAt("2024-06-14T16:00:00Z", "P1D", { timeZone: "Europe/Amsterdam", atLocalTime: "10:00" }) // "2024-06-13T10:00:00+02:00[Europe/Amsterdam]"
|
|
158
|
+
* @example cutoffAt("2024-11-05T17:00:00Z", "PT96H", { timeZone: "America/New_York" }) // "2024-11-01T13:00:00-04:00[America/New_York]" (96 elapsed hours across the fall-back)
|
|
159
|
+
* @example cutoffAt("2024-03-11T22:00:00Z", "P2D", { timeZone: "America/New_York", atLocalTime: "17:00" }) // "2024-03-09T17:00:00-05:00[America/New_York]" (17:00 local, across the spring-forward)
|
|
160
|
+
* @example cutoffAt("2024-06-18T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00", calendar: { weekend: [6, 7], holidays: [], timeZone: "Europe/Amsterdam" }, roll: "preceding" }) // "2024-06-14T17:00:00+02:00[Europe/Amsterdam]" (Sunday rolls back to Friday)
|
|
161
|
+
* @example cutoffAt("2024-06-18T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00", calendar: { weekend: [6, 7], holidays: [], timeZone: "Europe/Amsterdam" } }) // "" (a calendar needs a roll convention)
|
|
162
|
+
* @example cutoffAt("2024-11-04T23:00:00Z", "P1D", { timeZone: "America/New_York", atLocalTime: "01:30" }) // "2024-11-03T01:30:00-04:00[America/New_York]" (a repeated hour takes the earlier pass)
|
|
163
|
+
* @example cutoffAt("2024-03-11T22:00:00Z", "P1D", { timeZone: "America/New_York", atLocalTime: "02:30" }) // "" (02:30 on 10 March never happened)
|
|
164
|
+
* @example cutoffAt("2024-06-14T18:00:00", "P2D", { timeZone: "Europe/Amsterdam" }) // "" (a zoneless anchor is not a moment)
|
|
165
|
+
* @example cutoffAt("2024-06-14T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", roll: "preceding" }) // "" (a roll needs a calendar)
|
|
166
|
+
*/
|
|
167
|
+
export function cutoffAt(anchor, offset, options) {
|
|
168
|
+
try {
|
|
169
|
+
const resolved = resolveOptions(options);
|
|
170
|
+
if (resolved === null ||
|
|
171
|
+
!isValidInstant(anchor) ||
|
|
172
|
+
!isValidDuration(offset)) {
|
|
173
|
+
return "";
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const start = instantFrom(anchor).toZonedDateTimeISO(resolved.timeZone);
|
|
177
|
+
const duration = Temporal.Duration.from(offset);
|
|
178
|
+
if (resolved.atLocalTime !== null) {
|
|
179
|
+
const day = rolledDate(start
|
|
180
|
+
.subtract(timePart(duration))
|
|
181
|
+
.toPlainDate()
|
|
182
|
+
.subtract(datePart(duration)), resolved);
|
|
183
|
+
const pinned = day === null
|
|
184
|
+
? null
|
|
185
|
+
: resolveWallTime(day.toPlainDateTime(resolved.atLocalTime), resolved.timeZone);
|
|
186
|
+
return pinned === null ? "" : pinned.toString();
|
|
187
|
+
}
|
|
188
|
+
const cutoff = subtractOffset(start, duration);
|
|
189
|
+
if (cutoff === null) {
|
|
190
|
+
return "";
|
|
191
|
+
}
|
|
192
|
+
const day = rolledDate(cutoff.toPlainDate(), resolved);
|
|
193
|
+
if (day === null) {
|
|
194
|
+
return "";
|
|
195
|
+
}
|
|
196
|
+
if (day.equals(cutoff.toPlainDate())) {
|
|
197
|
+
return cutoff.toString();
|
|
198
|
+
}
|
|
199
|
+
const rolled = resolveWallTime(day.toPlainDateTime(cutoff.toPlainTime()), resolved.timeZone);
|
|
200
|
+
return rolled === null ? "" : rolled.toString();
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return "";
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// Never throws (Core Rule 3): a hostile
|
|
208
|
+
// argument is invalid input, not an exception.
|
|
209
|
+
return "";
|
|
210
|
+
}
|
|
211
|
+
}
|