@northguild/gmt 1.18.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 -2920
- package/dist/calendar/calculate/bucketRange.d.ts +10 -2
- package/dist/calendar/calculate/bucketRange.js +18 -61
- package/dist/calendar/calculate/floorToZone.d.ts +10 -2
- package/dist/calendar/calculate/floorToZone.js +15 -7
- package/dist/calendar/hours/addOperatingTime.d.ts +6 -0
- package/dist/calendar/hours/addOperatingTime.js +7 -1
- package/dist/calendar/hours/isOpenAt.d.ts +6 -0
- package/dist/calendar/hours/isOpenAt.js +6 -0
- package/dist/calendar/hours/nextCloseAt.d.ts +6 -0
- package/dist/calendar/hours/nextCloseAt.js +7 -1
- package/dist/calendar/hours/nextOpenAt.d.ts +6 -0
- package/dist/calendar/hours/nextOpenAt.js +7 -1
- package/dist/calendar/hours/operatingIntervals.d.ts +5 -0
- package/dist/calendar/hours/operatingIntervals.js +5 -0
- package/dist/calendar/hours/operatingTimeBetween.d.ts +5 -0
- package/dist/calendar/hours/operatingTimeBetween.js +5 -0
- package/dist/calendar/hours/recurringWindows.d.ts +8 -1
- package/dist/calendar/hours/recurringWindows.js +12 -4
- 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/{durationAs.d.ts → totalDuration.d.ts} +25 -19
- package/dist/duration/calculate/{durationAs.js → totalDuration.js} +25 -19
- package/dist/duration/calculate/totalUnits.d.ts +49 -0
- package/dist/duration/calculate/totalUnits.js +73 -0
- package/dist/duration/compare/compareDurations.d.ts +1 -1
- package/dist/duration/compare/compareDurations.js +1 -1
- 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 +4 -0
- package/dist/instant/convert/fromOffsetInstant.js +6 -1
- package/dist/instant/convert/resolveLocal.d.ts +7 -2
- package/dist/instant/convert/resolveLocal.js +16 -8
- package/dist/instant/convert/toOffsetInstant.d.ts +12 -8
- package/dist/instant/convert/toOffsetInstant.js +19 -11
- 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/chargeableDays.d.ts +6 -0
- package/dist/intermodal/calculate/chargeableDays.js +12 -4
- package/dist/intermodal/calculate/freeTimeExpiry.d.ts +7 -0
- package/dist/intermodal/calculate/freeTimeExpiry.js +15 -4
- 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.js +4 -9
- 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 +3 -1
- package/dist/internal/freeTimeLedger.d.ts +5 -0
- package/dist/internal/freeTimeLedger.js +11 -2
- package/dist/internal/index.d.ts +5 -2
- package/dist/internal/index.js +9 -2
- 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/maxPieces.js +2 -1
- package/dist/internal/normalizeTimeZone.d.ts +4 -1
- package/dist/internal/normalizeTimeZone.js +4 -1
- package/dist/internal/operatingSchedule.d.ts +13 -4
- package/dist/internal/operatingSchedule.js +146 -58
- package/dist/internal/patternToken.d.ts +10 -3
- package/dist/internal/patternToken.js +31 -12
- 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/resolveRelativeUnit.d.ts +1 -1
- package/dist/internal/resolveRelativeUnit.js +1 -1
- package/dist/internal/resolveUnixIntervalPair.d.ts +8 -2
- package/dist/internal/resolveUnixIntervalPair.js +11 -7
- package/dist/internal/startOrEndOfUnix.d.ts +2 -1
- package/dist/internal/startOrEndOfUnix.js +9 -6
- 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/zonedNowUnitValue.d.ts +7 -4
- package/dist/internal/zonedNowUnitValue.js +8 -4
- package/dist/internal/zonedWallClockDifference.js +4 -4
- package/dist/internal/zonedWallClockOperations.d.ts +5 -2
- package/dist/internal/zonedWallClockOperations.js +7 -10
- package/dist/plain/calculate/addDate.js +4 -7
- package/dist/plain/calculate/addDateTime.js +4 -7
- package/dist/plain/calculate/addTime.js +4 -7
- package/dist/plain/calculate/endOfTime.d.ts +1 -1
- package/dist/plain/calculate/setDate.d.ts +20 -3
- package/dist/plain/calculate/setDate.js +27 -7
- package/dist/plain/calculate/setDateTime.d.ts +15 -3
- package/dist/plain/calculate/setDateTime.js +22 -7
- package/dist/plain/calculate/setTime.d.ts +13 -1
- package/dist/plain/calculate/setTime.js +21 -6
- package/dist/plain/calculate/startOfTime.d.ts +1 -1
- package/dist/plain/calculate/subtractDate.js +4 -7
- package/dist/plain/calculate/subtractDateTime.js +4 -7
- package/dist/plain/calculate/subtractTime.js +4 -7
- package/dist/plain/format/formatCalendar.js +2 -1
- package/dist/plain/format/formatRelativeDate.js +2 -1
- package/dist/plain/format/formatRelativeDateTime.js +2 -1
- package/dist/plain/format/formatRelativeTime.js +2 -1
- 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/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/intervalXorAllDate.js +2 -2
- package/dist/plain/interval/intervalXorAllDateTime.js +2 -2
- package/dist/plain/interval/intervalXorAllTime.js +2 -2
- package/dist/plain/interval/mergeIntervalsDate.js +2 -2
- package/dist/plain/interval/mergeIntervalsDateTime.js +2 -2
- package/dist/plain/interval/mergeIntervalsTime.js +2 -2
- package/dist/plain/parse/index.d.ts +1 -1
- package/dist/plain/parse/index.js +1 -1
- package/dist/plain/parse/parseDateTimeWithPattern.d.ts +16 -3
- package/dist/plain/parse/parseDateTimeWithPattern.js +20 -5
- package/dist/plain/parse/parseDateWithPattern.d.ts +17 -3
- package/dist/plain/parse/parseDateWithPattern.js +21 -5
- 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.js +1 -0
- package/dist/plain/parse/parseUnitFromDate.d.ts +3 -0
- package/dist/plain/parse/parseUnitFromDate.js +5 -1
- package/dist/plain/parse/parseUnitFromDateTime.d.ts +3 -0
- package/dist/plain/parse/parseUnitFromDateTime.js +5 -1
- 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/isValidSqlDateTime.d.ts +33 -0
- package/dist/plain/validate/isValidSqlDateTime.js +36 -0
- package/dist/precision/convert/fromNanoseconds.d.ts +9 -3
- package/dist/precision/convert/fromNanoseconds.js +9 -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/transport/calculate/crossingTime.d.ts +6 -1
- package/dist/transport/calculate/crossingTime.js +6 -1
- package/dist/transport/calculate/cutoffAt.d.ts +6 -1
- package/dist/transport/calculate/cutoffAt.js +2 -0
- package/dist/transport/calculate/cutoffSchedule.d.ts +6 -1
- package/dist/transport/calculate/cutoffSchedule.js +2 -0
- package/dist/transport/calculate/dwellTime.d.ts +6 -1
- package/dist/transport/calculate/dwellTime.js +6 -1
- package/dist/transport/calculate/scheduleDelivery.d.ts +13 -5
- package/dist/transport/calculate/scheduleDelivery.js +6 -1
- package/dist/transport/convert/etaAtZone.d.ts +6 -1
- package/dist/transport/convert/etaAtZone.js +6 -1
- package/dist/types/business-calendar.d.ts +5 -4
- package/dist/types/duty.d.ts +777 -0
- package/dist/types/duty.js +0 -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/free-time-options.d.ts +4 -3
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +5 -0
- package/dist/types/operating-schedule.d.ts +3 -2
- 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 +11 -2
- package/dist/unix/calculate/addUnix.js +14 -11
- package/dist/unix/calculate/diffUnix.d.ts +10 -2
- package/dist/unix/calculate/diffUnix.js +11 -6
- package/dist/unix/calculate/diffUnixAsDuration.d.ts +10 -2
- package/dist/unix/calculate/diffUnixAsDuration.js +10 -5
- package/dist/unix/calculate/endOfQuarterForUnix.d.ts +10 -2
- package/dist/unix/calculate/endOfQuarterForUnix.js +6 -0
- package/dist/unix/calculate/endOfUnix.d.ts +11 -2
- package/dist/unix/calculate/endOfUnix.js +7 -0
- package/dist/unix/calculate/isBetweenUnix.d.ts +3 -2
- package/dist/unix/calculate/isBetweenUnix.js +3 -3
- package/dist/unix/calculate/roundUnix.d.ts +10 -2
- package/dist/unix/calculate/roundUnix.js +13 -6
- package/dist/unix/calculate/setUnix.d.ts +25 -5
- package/dist/unix/calculate/setUnix.js +33 -12
- package/dist/unix/calculate/startOfQuarterForUnix.d.ts +10 -2
- package/dist/unix/calculate/startOfQuarterForUnix.js +6 -0
- package/dist/unix/calculate/startOfUnix.d.ts +11 -2
- package/dist/unix/calculate/startOfUnix.js +7 -0
- package/dist/unix/calculate/subtractUnix.d.ts +10 -2
- package/dist/unix/calculate/subtractUnix.js +13 -11
- package/dist/unix/compare/areUnixEqualBy.d.ts +11 -2
- package/dist/unix/compare/areUnixEqualBy.js +7 -0
- package/dist/unix/convert/convertUnixToPlainDate.d.ts +5 -2
- package/dist/unix/convert/convertUnixToPlainDate.js +5 -4
- package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +5 -2
- package/dist/unix/convert/convertUnixToPlainDateTime.js +5 -4
- package/dist/unix/convert/convertUnixToPlainTime.d.ts +5 -2
- package/dist/unix/convert/convertUnixToPlainTime.js +5 -4
- package/dist/unix/convert/convertUnixToZoned.d.ts +5 -1
- package/dist/unix/convert/convertUnixToZoned.js +5 -1
- package/dist/unix/format/formatCalendarUnix.d.ts +6 -2
- package/dist/unix/format/formatCalendarUnix.js +6 -1
- package/dist/unix/format/formatRelativeUnix.d.ts +11 -3
- package/dist/unix/format/formatRelativeUnix.js +13 -5
- package/dist/unix/format/formatUnix.d.ts +7 -2
- package/dist/unix/format/formatUnix.js +4 -0
- 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/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 +11 -2
- package/dist/unix/interval/intervalCountUnix.js +7 -0
- package/dist/unix/interval/intervalFromDurationUnix.d.ts +10 -2
- package/dist/unix/interval/intervalFromDurationUnix.js +12 -7
- package/dist/unix/interval/intervalLengthUnix.d.ts +10 -2
- package/dist/unix/interval/intervalLengthUnix.js +6 -0
- package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +10 -2
- package/dist/unix/interval/intervalOverlappingDaysUnix.js +10 -5
- package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +10 -2
- package/dist/unix/interval/splitIntervalByUnitUnix.js +12 -6
- package/dist/unix/parse/parseDateFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseDateFromUnix.js +3 -3
- package/dist/unix/parse/parseDayFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseDayOfWeekFromUnix.js +2 -2
- package/dist/unix/parse/parseHourFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMillisecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMinuteFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMonthFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseNanosecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseSecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseTimeFromUnix.d.ts +5 -2
- package/dist/unix/parse/parseTimeFromUnix.js +4 -3
- package/dist/unix/parse/parseUnitFromUnix.d.ts +9 -3
- package/dist/unix/parse/parseUnitFromUnix.js +21 -14
- package/dist/unix/parse/parseWeekFromUnix.d.ts +3 -2
- package/dist/unix/parse/parseWeekFromUnix.js +4 -4
- package/dist/unix/parse/parseYearFromUnix.d.ts +8 -3
- package/dist/unix/parse/parseYearFromUnix.js +4 -1
- package/dist/unix/validate/isValidUnixUnit.d.ts +1 -1
- package/dist/utc/calculate/addUtc.js +4 -7
- package/dist/utc/calculate/setUtc.d.ts +16 -3
- package/dist/utc/calculate/setUtc.js +22 -8
- package/dist/utc/calculate/subtractUtc.js +4 -7
- package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -2
- package/dist/utc/convert/convertUtcToPlainDate.js +10 -7
- package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +9 -2
- package/dist/utc/convert/convertUtcToPlainDateTime.js +12 -13
- package/dist/utc/convert/convertUtcToPlainTime.d.ts +5 -2
- package/dist/utc/convert/convertUtcToPlainTime.js +7 -6
- package/dist/utc/convert/convertUtcToZoned.d.ts +5 -1
- package/dist/utc/convert/convertUtcToZoned.js +5 -1
- package/dist/utc/format/formatCalendarUtc.d.ts +6 -2
- package/dist/utc/format/formatCalendarUtc.js +6 -1
- package/dist/utc/format/{formatHttp.d.ts → formatHttpDate.d.ts} +7 -7
- package/dist/utc/format/{formatHttp.js → formatHttpDate.js} +7 -7
- package/dist/utc/format/formatRelativeUtc.d.ts +11 -3
- package/dist/utc/format/formatRelativeUtc.js +13 -5
- package/dist/utc/format/formatUtc.d.ts +7 -2
- package/dist/utc/format/formatUtc.js +4 -0
- 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/intervalXorAllUtc.js +2 -2
- package/dist/utc/interval/mergeIntervalsUtc.js +2 -2
- package/dist/utc/parse/index.d.ts +1 -1
- package/dist/utc/parse/index.js +1 -1
- package/dist/utc/parse/parseDateFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseDateFromUtc.js +2 -2
- package/dist/utc/parse/parseDayFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseDayFromUtc.js +2 -2
- package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -4
- package/dist/utc/parse/parseHourFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseHourFromUtc.js +2 -2
- 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 +4 -2
- package/dist/utc/parse/parseMicrosecondFromUtc.js +2 -2
- package/dist/utc/parse/parseMillisecondFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseMillisecondFromUtc.js +2 -2
- package/dist/utc/parse/parseMinuteFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseMinuteFromUtc.js +2 -2
- package/dist/utc/parse/parseMonthFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseMonthFromUtc.js +2 -2
- package/dist/utc/parse/parseNanosecondFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseNanosecondFromUtc.js +2 -2
- package/dist/utc/parse/parseSecondFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseSecondFromUtc.js +2 -2
- package/dist/utc/parse/parseTimeFromUtc.d.ts +5 -2
- package/dist/utc/parse/parseTimeFromUtc.js +5 -4
- package/dist/utc/parse/parseUnitFromUtc.d.ts +10 -3
- package/dist/utc/parse/parseUnitFromUtc.js +11 -5
- package/dist/utc/parse/parseWeekFromUtc.d.ts +4 -2
- package/dist/utc/parse/parseWeekFromUtc.js +4 -4
- package/dist/utc/parse/parseYearFromUtc.d.ts +8 -4
- package/dist/utc/parse/parseYearFromUtc.js +8 -5
- 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/isValidUtcTimestamp.d.ts +43 -0
- package/dist/utc/validate/isValidUtcTimestamp.js +48 -0
- package/dist/zoned/calculate/addZoned.js +4 -7
- package/dist/zoned/calculate/setZoned.d.ts +19 -5
- package/dist/zoned/calculate/setZoned.js +26 -9
- package/dist/zoned/calculate/subtractZoned.js +4 -7
- package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +4 -1
- package/dist/zoned/convert/convertPlainDateTimeToZoned.js +4 -1
- package/dist/zoned/convert/convertZonedToZoned.d.ts +5 -1
- package/dist/zoned/convert/convertZonedToZoned.js +5 -1
- package/dist/zoned/format/formatCalendarZoned.js +2 -1
- package/dist/zoned/format/formatRelativeZoned.js +2 -1
- package/dist/zoned/format/formatTimeZoneName.d.ts +5 -1
- package/dist/zoned/format/formatTimeZoneName.js +5 -1
- package/dist/zoned/get/getDstTransitions.d.ts +5 -3
- package/dist/zoned/get/getDstTransitions.js +12 -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 +10 -2
- package/dist/zoned/get/getTimeZoneOffset.js +18 -5
- 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 +5 -1
- package/dist/zoned/get/getZonedNow.js +5 -1
- 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/intervalXorAllZoned.js +2 -2
- package/dist/zoned/interval/mergeIntervalsZoned.js +2 -2
- package/dist/zoned/parse/parseUnitFromZoned.d.ts +4 -1
- package/dist/zoned/parse/parseUnitFromZoned.js +5 -1
- package/dist/zoned/parse/parseYearFromZoned.d.ts +4 -2
- package/dist/zoned/parse/parseYearFromZoned.js +6 -3
- package/dist/zoned/validate/hasDaylightSaving.d.ts +4 -2
- package/dist/zoned/validate/hasDaylightSaving.js +13 -7
- 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/package.json +50 -1
- package/skills/gmt-arithmetic/SKILL.md +99 -12
- package/skills/gmt-basics/SKILL.md +57 -15
- package/skills/gmt-integration/SKILL.md +24 -9
- package/skills/gmt-timezone/SKILL.md +134 -29
- package/dist/internal/unixZonedDateTime.d.ts +0 -22
- package/dist/internal/unixZonedDateTime.js +0 -32
- package/dist/internal/utcZonedDateTime.d.ts +0 -19
- package/dist/internal/utcZonedDateTime.js +0 -31
|
@@ -29,11 +29,18 @@ import type { ZoneBucketUnit } from "../../types/index.js";
|
|
|
29
29
|
* if a zone ever presented more transitions inside one bucket than the stepper walks — no
|
|
30
30
|
* IANA zone does, and the whole table was swept to confirm it. A truncated list would be
|
|
31
31
|
* worse than the sentinel, so none is returned in any of those cases.
|
|
32
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
33
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
34
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
35
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
36
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `[]`. An offset to the minute has no
|
|
37
|
+
* such limit.
|
|
32
38
|
*
|
|
33
39
|
* @param start ISO 8601 instant string for the range start (inclusive)
|
|
34
40
|
* @param end ISO 8601 instant string for the range end (exclusive)
|
|
35
|
-
* @param unit bucket unit ("
|
|
36
|
-
* @param timeZone IANA name or UTC offset the buckets are computed in
|
|
41
|
+
* @param unit bucket unit ("month" | "week" | "day" | "hour", or its plural)
|
|
42
|
+
* @param timeZone IANA name or UTC offset the buckets are computed in: a time zone identifier
|
|
43
|
+
* (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
|
|
37
44
|
* @returns array of UTC instant strings ending in "Z", or [] on invalid input
|
|
38
45
|
*
|
|
39
46
|
* @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "day", "America/New_York") // ["2024-06-14T04:00:00Z", "2024-06-15T04:00:00Z", "2024-06-16T04:00:00Z"]
|
|
@@ -45,5 +52,6 @@ import type { ZoneBucketUnit } from "../../types/index.js";
|
|
|
45
52
|
* @example bucketRange("2024-06-16T00:00:00Z", "2024-06-15T00:00:00Z", "day", "UTC") // [] (start after end)
|
|
46
53
|
* @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "days", "America/New_York") // ["2024-06-14T04:00:00Z", "2024-06-15T04:00:00Z", "2024-06-16T04:00:00Z"] (plural unit name)
|
|
47
54
|
* @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "year", "UTC") // [] (not a bucketing unit)
|
|
55
|
+
* @example bucketRange("1970-01-01T00:00:00Z", "1970-01-02T01:00:00Z", "day", "-00:44:30") // ["1969-12-31T00:44:30Z", "1970-01-01T00:44:30Z", "1970-01-02T00:44:30Z"]
|
|
48
56
|
*/
|
|
49
57
|
export declare function bucketRange(start: string, end: string, unit: Temporal.SmallestUnit<ZoneBucketUnit>, timeZone: string): string[];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
-
import { instantFrom, nextZonedBucketStart,
|
|
2
|
+
import { frameInstant, frameZoned, instantFrom, nextZonedBucketStart, zonedUnitStart, zoneFrame, } from "../../internal/index.js";
|
|
3
3
|
import { isValidInstant } from "../../precision/validate/index.js";
|
|
4
|
-
import { isValidTimeZone } from "../../zoned/validate/index.js";
|
|
5
4
|
import { isValidZoneBucketUnit } from "../validate/index.js";
|
|
6
5
|
import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
|
|
6
|
+
import { certainlyTouchesMoreBuckets } from "../../internal/zoneBucketCap.js";
|
|
7
7
|
/**
|
|
8
8
|
* Buckets a single call will return before giving up.
|
|
9
9
|
*
|
|
@@ -12,58 +12,6 @@ import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
|
|
|
12
12
|
* months — past anything a caller renders or aggregates in one pass.
|
|
13
13
|
*/
|
|
14
14
|
const MAX_BUCKETS = 10_000;
|
|
15
|
-
const NANOSECONDS_PER_HOUR = 3600000000000n;
|
|
16
|
-
/**
|
|
17
|
-
* The longest wall-clock stretch of each unit. Any wall-clock interval this long holds a unit
|
|
18
|
-
* start: an hour holds an hour start, 24 hours a midnight, 7 days a Monday, 31 days a first of
|
|
19
|
-
* the month.
|
|
20
|
-
*/
|
|
21
|
-
const LONGEST_UNIT_NANOSECONDS = {
|
|
22
|
-
hour: NANOSECONDS_PER_HOUR,
|
|
23
|
-
day: 24n * NANOSECONDS_PER_HOUR,
|
|
24
|
-
week: 168n * NANOSECONDS_PER_HOUR,
|
|
25
|
-
month: 744n * NANOSECONDS_PER_HOUR,
|
|
26
|
-
};
|
|
27
|
-
/** Offset transitions read before the pre-count gives up and leaves the answer to the walk. */
|
|
28
|
-
const MAX_PRECOUNT_TRANSITIONS = 4_096;
|
|
29
|
-
/**
|
|
30
|
-
* True when `[start, end)` certainly touches more than `MAX_BUCKETS` buckets, decided from the span
|
|
31
|
-
* instead of stepping bucket by bucket (which costs milliseconds a step in some zones).
|
|
32
|
-
*
|
|
33
|
-
* Over a prefix of the range, the local wall clock runs continuously between offset transitions.
|
|
34
|
-
* Those stretches cover at least the prefix's length less every backward offset change, in at most
|
|
35
|
-
* one stretch more than there are transitions, and each stretch of wall clock holds at least
|
|
36
|
-
* `floor(length / LONGEST_UNIT_NANOSECONDS)` distinct unit starts, each the start of its own
|
|
37
|
-
* bucket before `end`. The count subtracts two per stretch for the partial units at its ends.
|
|
38
|
-
* `false` means "not certain": the walk decides, exactly as before.
|
|
39
|
-
*/
|
|
40
|
-
function certainlyExceedsBucketCap(startZoned, endZoned, unit) {
|
|
41
|
-
const unitNs = LONGEST_UNIT_NANOSECONDS[unit];
|
|
42
|
-
const startNs = startZoned.epochNanoseconds;
|
|
43
|
-
const prefixEndNs = [
|
|
44
|
-
endZoned.epochNanoseconds,
|
|
45
|
-
startNs + 2n * BigInt(MAX_BUCKETS + 1) * unitNs,
|
|
46
|
-
].reduce((a, b) => (a < b ? a : b));
|
|
47
|
-
if (prefixEndNs - startNs <= BigInt(MAX_BUCKETS) * unitNs) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
let backwardNs = 0n;
|
|
51
|
-
let transitions = 0;
|
|
52
|
-
try {
|
|
53
|
-
for (let current = startZoned, next = zonedNextTransition(current); next !== null && next.epochNanoseconds < prefixEndNs; current = next, next = zonedNextTransition(current)) {
|
|
54
|
-
if (++transitions > MAX_PRECOUNT_TRANSITIONS) {
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
const shift = BigInt(current.offsetNanoseconds - next.offsetNanoseconds);
|
|
58
|
-
backwardNs += shift > 0n ? shift : 0n;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
const wallStarts = (prefixEndNs - startNs - backwardNs) / unitNs;
|
|
65
|
-
return wallStarts - 2n * BigInt(transitions + 1) > BigInt(MAX_BUCKETS);
|
|
66
|
-
}
|
|
67
15
|
/**
|
|
68
16
|
* The bucket start after `current`: `undefined` when it lies past Temporal's last representable
|
|
69
17
|
* instant, null when the stepper cannot find it.
|
|
@@ -107,11 +55,18 @@ function nextBucketStartWithinRange(current, unit) {
|
|
|
107
55
|
* if a zone ever presented more transitions inside one bucket than the stepper walks — no
|
|
108
56
|
* IANA zone does, and the whole table was swept to confirm it. A truncated list would be
|
|
109
57
|
* worse than the sentinel, so none is returned in any of those cases.
|
|
58
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
59
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
60
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
61
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
62
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `[]`. An offset to the minute has no
|
|
63
|
+
* such limit.
|
|
110
64
|
*
|
|
111
65
|
* @param start ISO 8601 instant string for the range start (inclusive)
|
|
112
66
|
* @param end ISO 8601 instant string for the range end (exclusive)
|
|
113
|
-
* @param unit bucket unit ("
|
|
114
|
-
* @param timeZone IANA name or UTC offset the buckets are computed in
|
|
67
|
+
* @param unit bucket unit ("month" | "week" | "day" | "hour", or its plural)
|
|
68
|
+
* @param timeZone IANA name or UTC offset the buckets are computed in: a time zone identifier
|
|
69
|
+
* (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
|
|
115
70
|
* @returns array of UTC instant strings ending in "Z", or [] on invalid input
|
|
116
71
|
*
|
|
117
72
|
* @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "day", "America/New_York") // ["2024-06-14T04:00:00Z", "2024-06-15T04:00:00Z", "2024-06-16T04:00:00Z"]
|
|
@@ -123,22 +78,24 @@ function nextBucketStartWithinRange(current, unit) {
|
|
|
123
78
|
* @example bucketRange("2024-06-16T00:00:00Z", "2024-06-15T00:00:00Z", "day", "UTC") // [] (start after end)
|
|
124
79
|
* @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "days", "America/New_York") // ["2024-06-14T04:00:00Z", "2024-06-15T04:00:00Z", "2024-06-16T04:00:00Z"] (plural unit name)
|
|
125
80
|
* @example bucketRange("2024-06-15T03:00:00Z", "2024-06-17T03:00:00Z", "year", "UTC") // [] (not a bucketing unit)
|
|
81
|
+
* @example bucketRange("1970-01-01T00:00:00Z", "1970-01-02T01:00:00Z", "day", "-00:44:30") // ["1969-12-31T00:44:30Z", "1970-01-01T00:44:30Z", "1970-01-02T00:44:30Z"]
|
|
126
82
|
*/
|
|
127
83
|
export function bucketRange(start, end, unit, timeZone) {
|
|
128
84
|
// The singular name; the guard below rejects anything outside the four units.
|
|
129
85
|
const resolvedUnit = resolveDateTimeUnit(unit);
|
|
86
|
+
const frame = zoneFrame(timeZone);
|
|
130
87
|
if (!isValidInstant(start) ||
|
|
131
88
|
!isValidInstant(end) ||
|
|
132
89
|
!isValidZoneBucketUnit(resolvedUnit) ||
|
|
133
|
-
|
|
90
|
+
frame === null) {
|
|
134
91
|
return [];
|
|
135
92
|
}
|
|
136
93
|
try {
|
|
137
|
-
const startZoned = instantFrom(start)
|
|
138
|
-
const endZoned = instantFrom(end)
|
|
94
|
+
const startZoned = frameZoned(instantFrom(start), frame);
|
|
95
|
+
const endZoned = frameZoned(instantFrom(end), frame);
|
|
139
96
|
if (Temporal.ZonedDateTime.compare(startZoned, endZoned) > 0)
|
|
140
97
|
return [];
|
|
141
|
-
if (
|
|
98
|
+
if (certainlyTouchesMoreBuckets(startZoned, endZoned, resolvedUnit, MAX_BUCKETS))
|
|
142
99
|
return [];
|
|
143
100
|
const boundaries = [];
|
|
144
101
|
const first = zonedUnitStart(startZoned, resolvedUnit);
|
|
@@ -149,7 +106,7 @@ export function bucketRange(start, end, unit, timeZone) {
|
|
|
149
106
|
if (Temporal.ZonedDateTime.compare(current, endZoned) >= 0) {
|
|
150
107
|
return boundaries;
|
|
151
108
|
}
|
|
152
|
-
boundaries.push(current
|
|
109
|
+
boundaries.push(frameInstant(current, frame).toString());
|
|
153
110
|
const next = nextBucketStartWithinRange(current, resolvedUnit);
|
|
154
111
|
// Past the last representable instant, so after `end`: every touched bucket is collected.
|
|
155
112
|
if (next === undefined)
|
|
@@ -24,10 +24,17 @@ import type { ZoneBucketUnit } from "../../types/index.js";
|
|
|
24
24
|
* - Returns a UTC instant string ending in `"Z"`, exactly — no rounding.
|
|
25
25
|
* - Returns `""` on invalid input, and where the boundary itself is not representable — the
|
|
26
26
|
* week or month containing the first instant Temporal supports began before it.
|
|
27
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
28
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
29
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
30
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
31
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
|
|
32
|
+
* such limit.
|
|
27
33
|
*
|
|
28
34
|
* @param value ISO 8601 instant string (e.g. "2024-06-15T03:00:00Z")
|
|
29
|
-
* @param unit boundary unit ("
|
|
30
|
-
* @param timeZone IANA name or UTC offset the boundary is computed in
|
|
35
|
+
* @param unit boundary unit ("month" | "week" | "day" | "hour", or its plural)
|
|
36
|
+
* @param timeZone IANA name or UTC offset the boundary is computed in: a time zone identifier
|
|
37
|
+
* (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
|
|
31
38
|
* @returns UTC instant string ending in "Z", or "" on invalid input
|
|
32
39
|
*
|
|
33
40
|
* @example floorToZone("2024-06-15T03:00:00Z", "day", "America/New_York") // "2024-06-14T04:00:00Z" (the 14 June local midnight — the instant is already 14 June there)
|
|
@@ -40,5 +47,6 @@ import type { ZoneBucketUnit } from "../../types/index.js";
|
|
|
40
47
|
* @example floorToZone("2024-06-15T03:00:00", "day", "UTC") // "" (zoneless, so it names no instant)
|
|
41
48
|
* @example floorToZone("-271821-04-20T00:00:00Z", "month", "UTC") // "" (that month began before Temporal's range does)
|
|
42
49
|
* @example floorToZone("2024-06-15T03:00:00Z", "day", "Invalid/Zone") // ""
|
|
50
|
+
* @example floorToZone("1970-01-01T13:00:00Z", "day", "-00:44:30") // "1970-01-01T00:44:30Z" (local midnight at a stored offset with seconds)
|
|
43
51
|
*/
|
|
44
52
|
export declare function floorToZone(value: string, unit: Temporal.SmallestUnit<ZoneBucketUnit>, timeZone: string): string;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { instantFrom, zonedUnitStart } from "../../internal/index.js";
|
|
1
|
+
import { frameInstant, frameZoned, instantFrom, zonedUnitStart, zoneFrame, } from "../../internal/index.js";
|
|
2
2
|
import { isValidInstant } from "../../precision/validate/index.js";
|
|
3
|
-
import { isValidTimeZone } from "../../zoned/validate/index.js";
|
|
4
3
|
import { isValidZoneBucketUnit } from "../validate/index.js";
|
|
5
4
|
import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
|
|
6
5
|
/**
|
|
@@ -27,10 +26,17 @@ import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
|
|
|
27
26
|
* - Returns a UTC instant string ending in `"Z"`, exactly — no rounding.
|
|
28
27
|
* - Returns `""` on invalid input, and where the boundary itself is not representable — the
|
|
29
28
|
* week or month containing the first instant Temporal supports began before it.
|
|
29
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
30
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
31
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
32
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
33
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
|
|
34
|
+
* such limit.
|
|
30
35
|
*
|
|
31
36
|
* @param value ISO 8601 instant string (e.g. "2024-06-15T03:00:00Z")
|
|
32
|
-
* @param unit boundary unit ("
|
|
33
|
-
* @param timeZone IANA name or UTC offset the boundary is computed in
|
|
37
|
+
* @param unit boundary unit ("month" | "week" | "day" | "hour", or its plural)
|
|
38
|
+
* @param timeZone IANA name or UTC offset the boundary is computed in: a time zone identifier
|
|
39
|
+
* (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
|
|
34
40
|
* @returns UTC instant string ending in "Z", or "" on invalid input
|
|
35
41
|
*
|
|
36
42
|
* @example floorToZone("2024-06-15T03:00:00Z", "day", "America/New_York") // "2024-06-14T04:00:00Z" (the 14 June local midnight — the instant is already 14 June there)
|
|
@@ -43,19 +49,21 @@ import { resolveDateTimeUnit } from "../../internal/resolveDateTimeUnit.js";
|
|
|
43
49
|
* @example floorToZone("2024-06-15T03:00:00", "day", "UTC") // "" (zoneless, so it names no instant)
|
|
44
50
|
* @example floorToZone("-271821-04-20T00:00:00Z", "month", "UTC") // "" (that month began before Temporal's range does)
|
|
45
51
|
* @example floorToZone("2024-06-15T03:00:00Z", "day", "Invalid/Zone") // ""
|
|
52
|
+
* @example floorToZone("1970-01-01T13:00:00Z", "day", "-00:44:30") // "1970-01-01T00:44:30Z" (local midnight at a stored offset with seconds)
|
|
46
53
|
*/
|
|
47
54
|
export function floorToZone(value, unit, timeZone) {
|
|
48
55
|
// The singular name; the guard below rejects anything outside the four units.
|
|
49
56
|
const resolvedUnit = resolveDateTimeUnit(unit);
|
|
57
|
+
const frame = zoneFrame(timeZone);
|
|
50
58
|
if (!isValidInstant(value) ||
|
|
51
59
|
!isValidZoneBucketUnit(resolvedUnit) ||
|
|
52
|
-
|
|
60
|
+
frame === null) {
|
|
53
61
|
return "";
|
|
54
62
|
}
|
|
55
63
|
try {
|
|
56
|
-
const zoned = instantFrom(value)
|
|
64
|
+
const zoned = frameZoned(instantFrom(value), frame);
|
|
57
65
|
const start = zonedUnitStart(zoned, resolvedUnit);
|
|
58
|
-
return start ? start
|
|
66
|
+
return start ? frameInstant(start, frame).toString() : "";
|
|
59
67
|
}
|
|
60
68
|
catch {
|
|
61
69
|
return "";
|
|
@@ -17,6 +17,12 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
|
|
|
17
17
|
* - Returns `""` on invalid input: an invalid instant, duration or `OperatingSchedule`, a
|
|
18
18
|
* negative `duration`, a `within` that is not a non-negative ISO duration, a `disambiguation`
|
|
19
19
|
* that is not one of the four values, and a search that would go more than 10,000 local dates past the input's date.
|
|
20
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
21
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
22
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
23
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
24
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
|
|
25
|
+
* such limit.
|
|
20
26
|
*
|
|
21
27
|
* @param start ISO 8601 instant string where the clock starts
|
|
22
28
|
* @param duration ISO 8601 duration of open time, hours and smaller units (e.g. "PT8H")
|
|
@@ -18,6 +18,12 @@ import { instantAfterOpenTime, instantText, parseOpenTimeAmount, parseOperatingS
|
|
|
18
18
|
* - Returns `""` on invalid input: an invalid instant, duration or `OperatingSchedule`, a
|
|
19
19
|
* negative `duration`, a `within` that is not a non-negative ISO duration, a `disambiguation`
|
|
20
20
|
* that is not one of the four values, and a search that would go more than 10,000 local dates past the input's date.
|
|
21
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
22
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
23
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
24
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
25
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
|
|
26
|
+
* such limit.
|
|
21
27
|
*
|
|
22
28
|
* @param start ISO 8601 instant string where the clock starts
|
|
23
29
|
* @param duration ISO 8601 duration of open time, hours and smaller units (e.g. "PT8H")
|
|
@@ -44,7 +50,7 @@ export function addOperatingTime(start, duration, schedule, optionsArg) {
|
|
|
44
50
|
amount === null) {
|
|
45
51
|
return "";
|
|
46
52
|
}
|
|
47
|
-
const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.
|
|
53
|
+
const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.frame);
|
|
48
54
|
if (horizon === null) {
|
|
49
55
|
return "";
|
|
50
56
|
}
|
|
@@ -13,6 +13,11 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
|
|
|
13
13
|
* - Returns `false` on invalid input: an invalid instant or `OperatingSchedule`, or a
|
|
14
14
|
* `disambiguation` that is not one of the four values. Check the schedule with
|
|
15
15
|
* `operatingIntervals` when "closed" and "invalid" must be told apart.
|
|
16
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
17
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
18
|
+
* offset's seconds (under a minute) of the first instant Temporal supports
|
|
19
|
+
* (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `false`. There `false` is
|
|
20
|
+
* the sentinel, not a reading of the schedule. An offset to the minute has no such limit.
|
|
16
21
|
*
|
|
17
22
|
* @param isoString ISO 8601 instant string to test
|
|
18
23
|
* @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
|
|
@@ -24,6 +29,7 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
|
|
|
24
29
|
* @example isOpenAt("2024-06-15T01:00:00Z", { timeZone: "UTC", weekly: { 5: [{ from: "23:00", to: "06:00" }] } }) // true — Friday's night window, on Saturday morning
|
|
25
30
|
* @example isOpenAt("2024-07-04T14:00:00Z", { timeZone: "America/New_York", weekly: { 4: [{ from: "09:00", to: "17:00" }] }, holidays: ["2024-07-04"] }) // false — a holiday
|
|
26
31
|
* @example isOpenAt("2024-06-17T14:00:00", { timeZone: "UTC", weekly: { 1: [{ from: "09:00", to: "17:00" }] } }) // false — no offset, not an instant
|
|
32
|
+
* @example isOpenAt("1970-01-01T08:44:30Z", { timeZone: "-00:44:30", weekly: { 4: [{ from: "08:00", to: "17:00" }] } }) // true (08:00 at a stored offset with seconds)
|
|
27
33
|
*/
|
|
28
34
|
export declare function isOpenAt(isoString: string, schedule: OperatingSchedule, optionsArg?: {
|
|
29
35
|
/**
|
|
@@ -14,6 +14,11 @@ import { firstOpenInstant, parseOperatingSchedule, parseScheduleDisambiguation,
|
|
|
14
14
|
* - Returns `false` on invalid input: an invalid instant or `OperatingSchedule`, or a
|
|
15
15
|
* `disambiguation` that is not one of the four values. Check the schedule with
|
|
16
16
|
* `operatingIntervals` when "closed" and "invalid" must be told apart.
|
|
17
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
18
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
19
|
+
* offset's seconds (under a minute) of the first instant Temporal supports
|
|
20
|
+
* (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `false`. There `false` is
|
|
21
|
+
* the sentinel, not a reading of the schedule. An offset to the minute has no such limit.
|
|
17
22
|
*
|
|
18
23
|
* @param isoString ISO 8601 instant string to test
|
|
19
24
|
* @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
|
|
@@ -25,6 +30,7 @@ import { firstOpenInstant, parseOperatingSchedule, parseScheduleDisambiguation,
|
|
|
25
30
|
* @example isOpenAt("2024-06-15T01:00:00Z", { timeZone: "UTC", weekly: { 5: [{ from: "23:00", to: "06:00" }] } }) // true — Friday's night window, on Saturday morning
|
|
26
31
|
* @example isOpenAt("2024-07-04T14:00:00Z", { timeZone: "America/New_York", weekly: { 4: [{ from: "09:00", to: "17:00" }] }, holidays: ["2024-07-04"] }) // false — a holiday
|
|
27
32
|
* @example isOpenAt("2024-06-17T14:00:00", { timeZone: "UTC", weekly: { 1: [{ from: "09:00", to: "17:00" }] } }) // false — no offset, not an instant
|
|
33
|
+
* @example isOpenAt("1970-01-01T08:44:30Z", { timeZone: "-00:44:30", weekly: { 4: [{ from: "08:00", to: "17:00" }] } }) // true (08:00 at a stored offset with seconds)
|
|
28
34
|
*/
|
|
29
35
|
export function isOpenAt(isoString, schedule, optionsArg) {
|
|
30
36
|
try {
|
|
@@ -14,6 +14,12 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
|
|
|
14
14
|
* - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, a `within` that is
|
|
15
15
|
* not a non-negative ISO duration, a `disambiguation` that is not one of the four values, and
|
|
16
16
|
* a search that would go more than 10,000 local dates past the input's date.
|
|
17
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
18
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
19
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
20
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
21
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
|
|
22
|
+
* such limit.
|
|
17
23
|
*
|
|
18
24
|
* @param isoString ISO 8601 instant string to search from, inclusive
|
|
19
25
|
* @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
|
|
@@ -15,6 +15,12 @@ import { firstClosedInstant, instantText, parseOperatingSchedule, parseScheduleD
|
|
|
15
15
|
* - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, a `within` that is
|
|
16
16
|
* not a non-negative ISO duration, a `disambiguation` that is not one of the four values, and
|
|
17
17
|
* a search that would go more than 10,000 local dates past the input's date.
|
|
18
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
19
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
20
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
21
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
22
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
|
|
23
|
+
* such limit.
|
|
18
24
|
*
|
|
19
25
|
* @param isoString ISO 8601 instant string to search from, inclusive
|
|
20
26
|
* @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
|
|
@@ -36,7 +42,7 @@ export function nextCloseAt(isoString, schedule, optionsArg) {
|
|
|
36
42
|
if (disambiguation === null || resolved === null || from === null) {
|
|
37
43
|
return "";
|
|
38
44
|
}
|
|
39
|
-
const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.
|
|
45
|
+
const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.frame);
|
|
40
46
|
if (horizon === null) {
|
|
41
47
|
return "";
|
|
42
48
|
}
|
|
@@ -11,6 +11,12 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
|
|
|
11
11
|
* - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, a `within` that is
|
|
12
12
|
* not a non-negative ISO duration, a `disambiguation` that is not one of the four values, and
|
|
13
13
|
* a search that would go more than 10,000 local dates past the input's date.
|
|
14
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
15
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
16
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
17
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
18
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
|
|
19
|
+
* such limit.
|
|
14
20
|
*
|
|
15
21
|
* @param isoString ISO 8601 instant string to search from, inclusive
|
|
16
22
|
* @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
|
|
@@ -12,6 +12,12 @@ import { firstOpenInstant, instantText, parseOperatingSchedule, parseScheduleDis
|
|
|
12
12
|
* - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, a `within` that is
|
|
13
13
|
* not a non-negative ISO duration, a `disambiguation` that is not one of the four values, and
|
|
14
14
|
* a search that would go more than 10,000 local dates past the input's date.
|
|
15
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
16
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
17
|
+
* offset's seconds (under a minute) of the last instant Temporal supports
|
|
18
|
+
* (`+275760-09-13T00:00:00Z`) for an offset east of UTC, or of the first
|
|
19
|
+
* (`-271821-04-20T00:00:00Z`) for one west, this returns `""`. An offset to the minute has no
|
|
20
|
+
* such limit.
|
|
15
21
|
*
|
|
16
22
|
* @param isoString ISO 8601 instant string to search from, inclusive
|
|
17
23
|
* @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
|
|
@@ -32,7 +38,7 @@ export function nextOpenAt(isoString, schedule, optionsArg) {
|
|
|
32
38
|
if (disambiguation === null || resolved === null || from === null) {
|
|
33
39
|
return "";
|
|
34
40
|
}
|
|
35
|
-
const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.
|
|
41
|
+
const horizon = parseSearchHorizon(from, optionsArg?.within, resolved.frame);
|
|
36
42
|
if (horizon === null) {
|
|
37
43
|
return "";
|
|
38
44
|
}
|
|
@@ -18,6 +18,11 @@ import type { Disambiguation, Interval, OperatingSchedule } from "../../types/in
|
|
|
18
18
|
* for one date), when `range` is not a valid `Interval`, when `disambiguation` is not one of
|
|
19
19
|
* the four values, and when the range spans more than 10,000 local dates (about 27 years)
|
|
20
20
|
* counted from the date `range.start` falls on.
|
|
21
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
22
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
23
|
+
* offset's seconds (under a minute) of the first instant Temporal supports
|
|
24
|
+
* (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `[]`. An offset to the
|
|
25
|
+
* minute has no such limit.
|
|
21
26
|
*
|
|
22
27
|
* @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
|
|
23
28
|
* @param range `{ start, end }` record of ISO 8601 instant strings to expand the schedule inside
|
|
@@ -19,6 +19,11 @@ import { parseOperatingSchedule, parseScheduleDisambiguation, scheduleRunsWithin
|
|
|
19
19
|
* for one date), when `range` is not a valid `Interval`, when `disambiguation` is not one of
|
|
20
20
|
* the four values, and when the range spans more than 10,000 local dates (about 27 years)
|
|
21
21
|
* counted from the date `range.start` falls on.
|
|
22
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
23
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
24
|
+
* offset's seconds (under a minute) of the first instant Temporal supports
|
|
25
|
+
* (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `[]`. An offset to the
|
|
26
|
+
* minute has no such limit.
|
|
22
27
|
*
|
|
23
28
|
* @param schedule `{ timeZone, weekly, holidays?, overrides? }` operating schedule
|
|
24
29
|
* @param range `{ start, end }` record of ISO 8601 instant strings to expand the schedule inside
|
|
@@ -14,6 +14,11 @@ import type { Disambiguation, OperatingSchedule } from "../../types/index.js";
|
|
|
14
14
|
* - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, `start` after
|
|
15
15
|
* `end`, a `disambiguation` that is not one of the four values, and a range spanning more than
|
|
16
16
|
* 10,000 local dates (about 27 years) counted from the date `start` falls on.
|
|
17
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
18
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
19
|
+
* offset's seconds (under a minute) of the first instant Temporal supports
|
|
20
|
+
* (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `""`. An offset to the
|
|
21
|
+
* minute has no such limit.
|
|
17
22
|
*
|
|
18
23
|
* @param start ISO 8601 instant string where the clock starts (inclusive)
|
|
19
24
|
* @param end ISO 8601 instant string where the clock stops (exclusive)
|
|
@@ -15,6 +15,11 @@ import { parseOperatingSchedule, parseScheduleDisambiguation, scheduleRunsWithin
|
|
|
15
15
|
* - Returns `""` on invalid input: an invalid instant or `OperatingSchedule`, `start` after
|
|
16
16
|
* `end`, a `disambiguation` that is not one of the four values, and a range spanning more than
|
|
17
17
|
* 10,000 local dates (about 27 years) counted from the date `start` falls on.
|
|
18
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
19
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
20
|
+
* offset's seconds (under a minute) of the first instant Temporal supports
|
|
21
|
+
* (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `""`. An offset to the
|
|
22
|
+
* minute has no such limit.
|
|
18
23
|
*
|
|
19
24
|
* @param start ISO 8601 instant string where the clock starts (inclusive)
|
|
20
25
|
* @param end ISO 8601 instant string where the clock stops (exclusive)
|
|
@@ -31,10 +31,16 @@ import type { Disambiguation, Interval, OperatingSchedule } from "../../types/in
|
|
|
31
31
|
* `range` is not a valid `Interval`, when `timeZone` is invalid, when `disambiguation` is not
|
|
32
32
|
* one of the four values, and when the range spans more than 10,000 local dates (about 27
|
|
33
33
|
* years) counted from the date `range.start` falls on, rather than a truncated list.
|
|
34
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
35
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
36
|
+
* offset's seconds (under a minute) of the first instant Temporal supports
|
|
37
|
+
* (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `[]`. An offset to the
|
|
38
|
+
* minute has no such limit.
|
|
34
39
|
*
|
|
35
40
|
* @param weekly windows by ISO weekday, `{ 1: [{ from: "09:00", to: "17:00" }], … }`
|
|
36
41
|
* @param range `{ start, end }` record of ISO 8601 instant strings to expand the pattern inside
|
|
37
|
-
* @param timeZone IANA name or UTC offset the windows are read in
|
|
42
|
+
* @param timeZone IANA name or UTC offset the windows are read in: a time zone identifier
|
|
43
|
+
* (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
|
|
38
44
|
* @param optionsArg How a window edge on a clock change is resolved
|
|
39
45
|
* @returns sorted, merged `{ start, end }` records of the open instants, or [] on invalid input
|
|
40
46
|
*
|
|
@@ -47,6 +53,7 @@ import type { Disambiguation, Interval, OperatingSchedule } from "../../types/in
|
|
|
47
53
|
* @example recurringWindows({ 8: [{ from: "09:00", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "UTC") // [] — not an ISO weekday
|
|
48
54
|
* @example recurringWindows({ 1: [{ from: "9am", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "UTC") // [] — malformed window
|
|
49
55
|
* @example recurringWindows({ 1: [{ from: "09:00", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "Invalid/Zone") // []
|
|
56
|
+
* @example recurringWindows({ 4: [{ from: "08:00", to: "17:00" }] }, { start: "1970-01-01T00:00:00Z", end: "1970-01-02T00:00:00Z" }, "-00:44:30") // [{ start: "1970-01-01T08:44:30Z", end: "1970-01-01T17:44:30Z" }]
|
|
50
57
|
*/
|
|
51
58
|
export declare function recurringWindows(weekly: OperatingSchedule["weekly"], range: Interval, timeZone: string, optionsArg?: {
|
|
52
59
|
/**
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { parseIntervalNanoseconds } from "../../internal/index.js";
|
|
1
|
+
import { parseIntervalNanoseconds, zoneFrame } from "../../internal/index.js";
|
|
2
2
|
import { parseScheduleDisambiguation, parseWeeklyPattern, scheduleRunsWithin, } from "../../internal/operatingSchedule.js";
|
|
3
|
-
import { isValidTimeZone } from "../../zoned/validate/index.js";
|
|
4
3
|
/**
|
|
5
4
|
* Return the instants a weekly pattern of local windows is open inside `range`, read in
|
|
6
5
|
* `timeZone`: the primitive under operating hours, curfews and recurring crew windows.
|
|
@@ -33,10 +32,16 @@ import { isValidTimeZone } from "../../zoned/validate/index.js";
|
|
|
33
32
|
* `range` is not a valid `Interval`, when `timeZone` is invalid, when `disambiguation` is not
|
|
34
33
|
* one of the four values, and when the range spans more than 10,000 local dates (about 27
|
|
35
34
|
* years) counted from the date `range.start` falls on, rather than a truncated list.
|
|
35
|
+
* - **Limit at an offset with seconds.** The instant is placed in the offset's whole-minute zone,
|
|
36
|
+
* moved by its seconds, and the moved instant must be inside Temporal's range. So within the
|
|
37
|
+
* offset's seconds (under a minute) of the first instant Temporal supports
|
|
38
|
+
* (`-271821-04-20T00:00:00Z`), for an offset west of UTC, this returns `[]`. An offset to the
|
|
39
|
+
* minute has no such limit.
|
|
36
40
|
*
|
|
37
41
|
* @param weekly windows by ISO weekday, `{ 1: [{ from: "09:00", to: "17:00" }], … }`
|
|
38
42
|
* @param range `{ start, end }` record of ISO 8601 instant strings to expand the pattern inside
|
|
39
|
-
* @param timeZone IANA name or UTC offset the windows are read in
|
|
43
|
+
* @param timeZone IANA name or UTC offset the windows are read in: a time zone identifier
|
|
44
|
+
* (`+05:30`, `+0530`, `-08`) or a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
|
|
40
45
|
* @param optionsArg How a window edge on a clock change is resolved
|
|
41
46
|
* @returns sorted, merged `{ start, end }` records of the open instants, or [] on invalid input
|
|
42
47
|
*
|
|
@@ -49,21 +54,24 @@ import { isValidTimeZone } from "../../zoned/validate/index.js";
|
|
|
49
54
|
* @example recurringWindows({ 8: [{ from: "09:00", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "UTC") // [] — not an ISO weekday
|
|
50
55
|
* @example recurringWindows({ 1: [{ from: "9am", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "UTC") // [] — malformed window
|
|
51
56
|
* @example recurringWindows({ 1: [{ from: "09:00", to: "17:00" }] }, { start: "2024-06-10T00:00:00Z", end: "2024-06-11T00:00:00Z" }, "Invalid/Zone") // []
|
|
57
|
+
* @example recurringWindows({ 4: [{ from: "08:00", to: "17:00" }] }, { start: "1970-01-01T00:00:00Z", end: "1970-01-02T00:00:00Z" }, "-00:44:30") // [{ start: "1970-01-01T08:44:30Z", end: "1970-01-01T17:44:30Z" }]
|
|
52
58
|
*/
|
|
53
59
|
export function recurringWindows(weekly, range, timeZone, optionsArg) {
|
|
54
60
|
try {
|
|
55
61
|
const disambiguation = parseScheduleDisambiguation(optionsArg);
|
|
56
62
|
const weeklyWindows = parseWeeklyPattern(weekly);
|
|
57
63
|
const bounds = parseIntervalNanoseconds(range);
|
|
64
|
+
const frame = zoneFrame(timeZone);
|
|
58
65
|
if (disambiguation === null ||
|
|
59
66
|
weeklyWindows === null ||
|
|
60
67
|
bounds === null ||
|
|
61
68
|
typeof timeZone !== "string" ||
|
|
62
|
-
|
|
69
|
+
frame === null) {
|
|
63
70
|
return [];
|
|
64
71
|
}
|
|
65
72
|
const runs = scheduleRunsWithin({
|
|
66
73
|
timeZone,
|
|
74
|
+
frame,
|
|
67
75
|
weekly: weeklyWindows,
|
|
68
76
|
holidays: new Set(),
|
|
69
77
|
overrides: new Map(),
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { DateTimeDurationUnit } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Write an amount given as a unit object, such as `{ minutes: 15 }`, as an ISO 8601 duration
|
|
4
|
+
* string.
|
|
5
|
+
*
|
|
6
|
+
* - Uses Temporal.Duration.from to read the fields, then .toString() to write them.
|
|
7
|
+
* - Which function to use: `durationFromUnits` turns a unit object into the duration string that
|
|
8
|
+
* the other duration functions take. `totalUnits` totals a unit object of exact units in one
|
|
9
|
+
* call. `totalDuration` totals a duration string.
|
|
10
|
+
* - Takes all ten units, from years down to nanoseconds: writing a year, a month or a week needs
|
|
11
|
+
* no date to measure from. To total a calendar amount, pass the result to `totalDuration` with
|
|
12
|
+
* `relativeTo`.
|
|
13
|
+
* - Years down to minutes are written as given, and nothing is carried into a larger unit:
|
|
14
|
+
* `{ minutes: 90 }` is "PT90M". `normalizeDuration` with `largestUnit` carries it.
|
|
15
|
+
* - Seconds, milliseconds, microseconds and nanoseconds are written together as one decimal
|
|
16
|
+
* number of seconds, as Temporal's `Duration.prototype.toString` writes them:
|
|
17
|
+
* `{ milliseconds: 1500 }` is "PT1.5S". Reading that string back gives 1 second and 500
|
|
18
|
+
* milliseconds.
|
|
19
|
+
* - A zero amount is "PT0S", the one spelling Temporal writes for every zero duration.
|
|
20
|
+
* - Every key is a unit name in the plural, and every amount is a whole finite number. All
|
|
21
|
+
* nonzero amounts share one sign, as Temporal requires of a duration. A unit set to `undefined`
|
|
22
|
+
* is absent, as Temporal reads it.
|
|
23
|
+
* - An unknown key returns "", even beside a valid one. Temporal on its own ignores an unknown
|
|
24
|
+
* key, so a misspelt `{ minutes: 15, hour: 1 }` would be written "PT15M" with no warning.
|
|
25
|
+
* - Returns "" on an object with no unit, a non-object `units` (a duration string included), an
|
|
26
|
+
* invalid amount, or an amount past Temporal's duration range.
|
|
27
|
+
*
|
|
28
|
+
* @param units Partial<Record<DateTimeDurationUnit, number>> object holding the amount to write
|
|
29
|
+
* @returns ISO 8601 duration string, or "" on invalid input
|
|
30
|
+
*
|
|
31
|
+
* @example durationFromUnits({ minutes: 15 }) // "PT15M"
|
|
32
|
+
* @example durationFromUnits({ days: 1, hours: 12 }) // "P1DT12H"
|
|
33
|
+
* @example durationFromUnits({ minutes: 90 }) // "PT90M" (not carried into hours)
|
|
34
|
+
* @example durationFromUnits({ years: 1, months: 2 }) // "P1Y2M"
|
|
35
|
+
* @example durationFromUnits({ weeks: 1 }) // "P1W"
|
|
36
|
+
* @example durationFromUnits({ milliseconds: 1500 }) // "PT1.5S"
|
|
37
|
+
* @example durationFromUnits({ seconds: 59, milliseconds: 1500 }) // "PT60.5S" (one decimal number of seconds)
|
|
38
|
+
* @example durationFromUnits({ minutes: 15, hours: undefined }) // "PT15M" (an undefined unit is absent)
|
|
39
|
+
* @example durationFromUnits({ minutes: -15 }) // "-PT15M"
|
|
40
|
+
* @example durationFromUnits({ minutes: 0 }) // "PT0S"
|
|
41
|
+
* @example durationFromUnits({ minutes: 15, hour: 1 }) // "" (unknown key "hour")
|
|
42
|
+
* @example durationFromUnits({ minutes: 1.5 }) // "" (fractional amount)
|
|
43
|
+
* @example durationFromUnits({ hours: 1, minutes: -30 }) // "" (mixed signs)
|
|
44
|
+
* @example durationFromUnits({}) // ""
|
|
45
|
+
* @example durationFromUnits("PT15M") // "" (already a duration string)
|
|
46
|
+
*/
|
|
47
|
+
export declare function durationFromUnits(units: Partial<Record<DateTimeDurationUnit, number>>): string;
|