@northguild/gmt 1.15.0 → 1.17.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 +1133 -272
- package/dist/calendar/business/businessDaysBetween.d.ts +37 -0
- package/dist/calendar/business/businessDaysBetween.js +89 -0
- package/dist/calendar/business/index.d.ts +7 -0
- package/dist/calendar/business/index.js +10 -0
- package/dist/calendar/business/mergeCalendars.d.ts +33 -0
- package/dist/calendar/business/mergeCalendars.js +68 -0
- package/dist/calendar/business/nextBusinessDay.d.ts +30 -0
- package/dist/calendar/business/nextBusinessDay.js +39 -0
- package/dist/calendar/business/previousBusinessDay.d.ts +30 -0
- package/dist/calendar/business/previousBusinessDay.js +39 -0
- package/dist/calendar/business/rollDate.d.ts +59 -0
- package/dist/calendar/business/rollDate.js +116 -0
- package/dist/calendar/calculate/bucketRange.d.ts +49 -0
- package/dist/calendar/calculate/bucketRange.js +169 -0
- package/dist/calendar/calculate/floorToZone.d.ts +42 -0
- package/dist/calendar/calculate/floorToZone.js +62 -0
- package/dist/calendar/calculate/getFiscalPeriod.d.ts +64 -0
- package/dist/calendar/calculate/getFiscalPeriod.js +96 -0
- package/dist/calendar/calculate/getIsoWeekDate.d.ts +35 -0
- package/dist/calendar/calculate/getIsoWeekDate.js +41 -0
- package/dist/calendar/calculate/getOrdinalDate.d.ts +25 -0
- package/dist/calendar/calculate/getOrdinalDate.js +28 -0
- package/dist/calendar/calculate/getQuarter.d.ts +36 -0
- package/dist/calendar/calculate/getQuarter.js +64 -0
- package/dist/calendar/calculate/index.d.ts +6 -0
- package/dist/calendar/calculate/index.js +6 -0
- package/dist/calendar/index.d.ts +4 -0
- package/dist/calendar/index.js +5 -0
- package/dist/calendar/validate/index.d.ts +4 -0
- package/dist/calendar/validate/index.js +4 -0
- package/dist/calendar/validate/isValidBusinessCalendar.d.ts +31 -0
- package/dist/calendar/validate/isValidBusinessCalendar.js +40 -0
- package/dist/calendar/validate/isValidFiscalPattern.d.ts +25 -0
- package/dist/calendar/validate/isValidFiscalPattern.js +29 -0
- package/dist/calendar/validate/isValidRollConvention.d.ts +28 -0
- package/dist/calendar/validate/isValidRollConvention.js +38 -0
- package/dist/calendar/validate/isValidZoneBucketUnit.d.ts +31 -0
- package/dist/calendar/validate/isValidZoneBucketUnit.js +39 -0
- package/dist/duration/calculate/durationAs.d.ts +27 -3
- package/dist/duration/calculate/durationAs.js +34 -8
- package/dist/duration/calculate/getDurationUnit.d.ts +5 -2
- package/dist/duration/calculate/getDurationUnit.js +7 -3
- package/dist/duration/compare/compareDurations.d.ts +25 -2
- package/dist/duration/compare/compareDurations.js +31 -7
- package/dist/duration/format/formatDuration.d.ts +14 -5
- package/dist/duration/format/formatDuration.js +47 -11
- package/dist/duration/index.d.ts +1 -0
- package/dist/duration/index.js +2 -0
- package/dist/duration/normalize/normalizeDuration.d.ts +33 -6
- package/dist/duration/normalize/normalizeDuration.js +41 -12
- package/dist/duration/parse/parseDuration.js +4 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/instant/convert/classifyLocal.d.ts +50 -0
- package/dist/instant/convert/classifyLocal.js +60 -0
- package/dist/instant/convert/fromOffsetInstant.d.ts +47 -0
- package/dist/instant/convert/fromOffsetInstant.js +91 -0
- package/dist/instant/convert/index.d.ts +4 -0
- package/dist/instant/convert/index.js +4 -0
- package/dist/instant/convert/resolveLocal.d.ts +40 -0
- package/dist/instant/convert/resolveLocal.js +76 -0
- package/dist/instant/convert/toOffsetInstant.d.ts +96 -0
- package/dist/instant/convert/toOffsetInstant.js +162 -0
- package/dist/instant/index.d.ts +2 -0
- package/dist/instant/index.js +3 -0
- package/dist/intermodal/calculate/billingTimeline.d.ts +94 -0
- package/dist/intermodal/calculate/billingTimeline.js +168 -0
- package/dist/intermodal/calculate/chargeableDays.d.ts +98 -0
- package/dist/intermodal/calculate/chargeableDays.js +101 -0
- package/dist/intermodal/calculate/demurrageClock.d.ts +93 -0
- package/dist/intermodal/calculate/demurrageClock.js +140 -0
- package/dist/intermodal/calculate/freeTimeExpiry.d.ts +66 -0
- package/dist/intermodal/calculate/freeTimeExpiry.js +82 -0
- package/dist/intermodal/calculate/index.d.ts +4 -0
- package/dist/intermodal/calculate/index.js +4 -0
- package/dist/intermodal/index.d.ts +2 -0
- package/dist/intermodal/index.js +3 -0
- package/dist/internal/adjustZonedBusinessDays.js +9 -7
- package/dist/internal/businessCalendar.d.ts +46 -0
- package/dist/internal/businessCalendar.js +230 -0
- package/dist/internal/businessDayValues.d.ts +20 -0
- package/dist/internal/businessDayValues.js +54 -0
- package/dist/internal/calendarDatePairPolicy.d.ts +10 -12
- package/dist/internal/calendarDatePairPolicy.js +13 -19
- package/dist/internal/calendarDateString.d.ts +32 -58
- package/dist/internal/calendarDateString.js +51 -93
- package/dist/internal/calendarSystemIds.d.ts +26 -2
- package/dist/internal/calendarSystemIds.js +57 -51
- package/dist/internal/calendarValueOfDate.d.ts +10 -12
- package/dist/internal/calendarValueOfDate.js +22 -20
- package/dist/internal/calendarValueOfZoned.d.ts +14 -17
- package/dist/internal/calendarValueOfZoned.js +25 -25
- package/dist/internal/calendarZonedPairPolicy.d.ts +11 -18
- package/dist/internal/calendarZonedPairPolicy.js +14 -25
- package/dist/internal/calendarZonedString.d.ts +41 -65
- package/dist/internal/calendarZonedString.js +52 -101
- package/dist/internal/compareUnixEpochs.d.ts +14 -0
- package/dist/internal/compareUnixEpochs.js +25 -0
- package/dist/internal/dateTimeUnitHelpers.d.ts +18 -0
- package/dist/internal/dateTimeUnitHelpers.js +27 -0
- package/dist/internal/dateUnitHelpers.d.ts +39 -1
- package/dist/internal/dateUnitHelpers.js +73 -11
- package/dist/internal/defaultFractionalDigits.d.ts +14 -0
- package/dist/internal/defaultFractionalDigits.js +23 -0
- package/dist/internal/differenceRecord.d.ts +32 -0
- package/dist/internal/differenceRecord.js +79 -0
- package/dist/internal/divisionBoundary.d.ts +19 -0
- package/dist/internal/divisionBoundary.js +23 -0
- package/dist/internal/durationUntilString.d.ts +1 -1
- package/dist/internal/durationUntilString.js +10 -2
- package/dist/internal/englishCalendarNames.d.ts +11 -0
- package/dist/internal/englishCalendarNames.js +21 -1
- package/dist/internal/epochNanoseconds.d.ts +27 -0
- package/dist/internal/epochNanoseconds.js +31 -0
- package/dist/internal/fiscalCalendar.d.ts +36 -0
- package/dist/internal/fiscalCalendar.js +86 -0
- package/dist/internal/floorDivide.d.ts +15 -0
- package/dist/internal/floorDivide.js +18 -0
- package/dist/internal/foreignEpochs.d.ts +134 -0
- package/dist/internal/foreignEpochs.js +139 -0
- package/dist/internal/formatCalendarDays.d.ts +28 -0
- package/dist/internal/formatCalendarDays.js +49 -0
- package/dist/internal/formatDateInCalendar.d.ts +14 -39
- package/dist/internal/formatDateInCalendar.js +16 -47
- package/dist/internal/formatRelativeDuration.d.ts +27 -0
- package/dist/internal/formatRelativeDuration.js +45 -0
- package/dist/internal/freeTimeLedger.d.ts +93 -0
- package/dist/internal/freeTimeLedger.js +262 -0
- package/dist/internal/getLocaleFirstDayOfWeek.d.ts +9 -6
- package/dist/internal/getLocaleFirstDayOfWeek.js +9 -10
- package/dist/internal/getLocaleWeekYearBounds.d.ts +17 -9
- package/dist/internal/getLocaleWeekYearBounds.js +45 -26
- package/dist/internal/getLocaleWeekendDays.d.ts +9 -18
- package/dist/internal/getLocaleWeekendDays.js +9 -5
- package/dist/internal/halfOpenIntervals.d.ts +102 -0
- package/dist/internal/halfOpenIntervals.js +180 -0
- package/dist/internal/hasCalendarAnnotation.d.ts +20 -20
- package/dist/internal/hasCalendarAnnotation.js +23 -21
- package/dist/internal/hourDurationString.d.ts +16 -0
- package/dist/internal/hourDurationString.js +47 -0
- package/dist/internal/httpDateFields.d.ts +24 -0
- package/dist/internal/httpDateFields.js +86 -0
- package/dist/internal/index.d.ts +30 -9
- package/dist/internal/index.js +30 -9
- package/dist/internal/instantFormatOptions.d.ts +43 -0
- package/dist/internal/instantFormatOptions.js +99 -0
- package/dist/internal/instantIntervalText.d.ts +20 -0
- package/dist/internal/instantIntervalText.js +25 -0
- package/dist/internal/instantNanoseconds.d.ts +25 -0
- package/dist/internal/instantNanoseconds.js +41 -0
- package/dist/internal/intervalCountHelpers.d.ts +16 -10
- package/dist/internal/intervalCountHelpers.js +1 -31
- package/dist/internal/intervalNanoseconds.d.ts +47 -0
- package/dist/internal/intervalNanoseconds.js +86 -0
- package/dist/internal/isObject.d.ts +26 -0
- package/dist/internal/isObject.js +30 -0
- package/dist/internal/isoStringBody.d.ts +66 -0
- package/dist/internal/isoStringBody.js +105 -0
- package/dist/internal/joinDateTimeConnector.d.ts +1 -1
- package/dist/internal/localeWeekInfo.d.ts +34 -0
- package/dist/internal/localeWeekInfo.js +27 -0
- package/dist/internal/maxPieces.d.ts +41 -0
- package/dist/internal/maxPieces.js +53 -0
- package/dist/internal/measureNearRangeEnd.d.ts +26 -0
- package/dist/internal/measureNearRangeEnd.js +47 -0
- package/dist/internal/monthGridWeekRow.d.ts +4 -1
- package/dist/internal/monthGridWeekRow.js +3 -0
- package/dist/internal/normalizeTimeZone.d.ts +17 -10
- package/dist/internal/normalizeTimeZone.js +25 -15
- package/dist/internal/patternToken.d.ts +2 -1
- package/dist/internal/patternToken.js +10 -4
- package/dist/internal/plainDateAdd.d.ts +20 -0
- package/dist/internal/plainDateAdd.js +42 -0
- package/dist/internal/plainDateUntil.d.ts +21 -0
- package/dist/internal/plainDateUntil.js +48 -0
- package/dist/internal/plainFormatOptions.d.ts +59 -0
- package/dist/internal/plainFormatOptions.js +165 -0
- package/dist/internal/resolveDateTimeUnit.d.ts +4 -1
- package/dist/internal/resolveDateTimeUnit.js +2 -12
- package/dist/internal/resolveDurationRelativeTo.d.ts +28 -22
- package/dist/internal/resolveDurationRelativeTo.js +69 -25
- package/dist/internal/resolveDurationUnit.d.ts +4 -1
- package/dist/internal/resolveDurationUnit.js +2 -11
- package/dist/internal/resolveLocale.d.ts +37 -0
- package/dist/internal/resolveLocale.js +59 -0
- package/dist/internal/resolveManualRoundingOptions.d.ts +23 -0
- package/dist/internal/resolveManualRoundingOptions.js +39 -0
- package/dist/internal/resolveMinimalDaysInFirstWeek.d.ts +19 -0
- package/dist/internal/resolveMinimalDaysInFirstWeek.js +28 -0
- package/dist/internal/resolveOverflow.d.ts +6 -0
- package/dist/internal/resolveOverflow.js +7 -1
- package/dist/internal/resolveReadingTimeZone.d.ts +11 -0
- package/dist/internal/resolveReadingTimeZone.js +18 -0
- package/dist/internal/resolveUnixIntervalPair.d.ts +30 -0
- package/dist/internal/resolveUnixIntervalPair.js +53 -0
- package/dist/internal/resolveWeekStartsOn.d.ts +12 -0
- package/dist/internal/resolveWeekStartsOn.js +18 -0
- package/dist/internal/rfc5322DateTime.d.ts +26 -0
- package/dist/internal/rfc5322DateTime.js +176 -0
- package/dist/internal/splitStep.d.ts +81 -0
- package/dist/internal/splitStep.js +182 -0
- package/dist/internal/startOrEndOfUnix.d.ts +26 -0
- package/dist/internal/startOrEndOfUnix.js +47 -0
- package/dist/{utc/calculate → internal}/startOrEndOfUtc.d.ts +8 -4
- package/dist/{utc/calculate → internal}/startOrEndOfUtc.js +30 -26
- package/dist/internal/startOrEndOfZoned.d.ts +22 -0
- package/dist/internal/startOrEndOfZoned.js +49 -0
- package/dist/internal/temporalCompat/calendarDateArithmetic.d.ts +33 -0
- package/dist/internal/temporalCompat/calendarDateArithmetic.js +199 -0
- package/dist/internal/temporalCompat/calendarDateFromFields.d.ts +36 -0
- package/dist/internal/temporalCompat/calendarDateFromFields.js +120 -0
- package/dist/internal/temporalCompat/calendarFields.d.ts +25 -0
- package/dist/internal/temporalCompat/calendarFields.js +131 -0
- package/dist/internal/temporalCompat/capabilities.d.ts +28 -0
- package/dist/internal/temporalCompat/capabilities.js +74 -0
- package/dist/internal/temporalCompat/fieldSearch.d.ts +21 -0
- package/dist/internal/temporalCompat/fieldSearch.js +83 -0
- package/dist/internal/temporalCompat/fixedDay.d.ts +25 -0
- package/dist/internal/temporalCompat/fixedDay.js +45 -0
- package/dist/internal/temporalCompat/hebrewArithmetic.d.ts +19 -0
- package/dist/internal/temporalCompat/hebrewArithmetic.js +150 -0
- package/dist/internal/temporalCompat/index.d.ts +4 -0
- package/dist/internal/temporalCompat/index.js +5 -0
- package/dist/internal/temporalCompat/indianArithmetic.d.ts +16 -0
- package/dist/internal/temporalCompat/indianArithmetic.js +87 -0
- package/dist/internal/temporalCompat/largeMonthSpan.d.ts +19 -0
- package/dist/internal/temporalCompat/largeMonthSpan.js +199 -0
- package/dist/internal/temporalCompat/nonIsoArithmetic.d.ts +59 -0
- package/dist/internal/temporalCompat/nonIsoArithmetic.js +220 -0
- package/dist/internal/temporalCompat/readArithmeticModel.d.ts +3 -0
- package/dist/internal/temporalCompat/readArithmeticModel.js +284 -0
- package/dist/internal/temporalCompat/repros.d.ts +31 -0
- package/dist/internal/temporalCompat/repros.js +556 -0
- package/dist/internal/toInstantFromUtc.d.ts +10 -0
- package/dist/internal/toInstantFromUtc.js +19 -0
- package/dist/internal/unixEpochValue.d.ts +166 -0
- package/dist/internal/unixEpochValue.js +245 -0
- package/dist/internal/unixFormatReference.d.ts +18 -0
- package/dist/internal/unixFormatReference.js +44 -0
- package/dist/internal/unixZonedDateTime.d.ts +22 -0
- package/dist/internal/unixZonedDateTime.js +32 -0
- package/dist/internal/utcOffsetString.d.ts +39 -0
- package/dist/internal/utcOffsetString.js +75 -0
- package/dist/internal/utcZonedDateTime.d.ts +16 -0
- package/dist/internal/utcZonedDateTime.js +28 -0
- package/dist/internal/wallClockAtOffset.d.ts +22 -0
- package/dist/internal/wallClockAtOffset.js +26 -0
- package/dist/internal/zonedBucket.d.ts +91 -0
- package/dist/internal/zonedBucket.js +441 -0
- package/dist/internal/zonedFormatReference.d.ts +15 -0
- package/dist/internal/zonedFormatReference.js +24 -0
- package/dist/internal/zonedLocalDates.d.ts +15 -0
- package/dist/internal/zonedLocalDates.js +58 -0
- package/dist/internal/zonedNowUnitValue.d.ts +24 -0
- package/dist/internal/zonedNowUnitValue.js +58 -0
- package/dist/internal/zonedWallClock.d.ts +84 -0
- package/dist/internal/zonedWallClock.js +427 -0
- package/dist/internal/zonedWallClockDifference.d.ts +92 -0
- package/dist/internal/zonedWallClockDifference.js +1174 -0
- package/dist/internal/zonedWallClockOperations.d.ts +132 -0
- package/dist/internal/zonedWallClockOperations.js +553 -0
- package/dist/internal/zonelessCalendarDate.d.ts +12 -0
- package/dist/internal/zonelessCalendarDate.js +22 -0
- package/dist/interval/calculate/clampInterval.d.ts +22 -0
- package/dist/interval/calculate/clampInterval.js +31 -0
- package/dist/interval/calculate/index.d.ts +6 -0
- package/dist/interval/calculate/index.js +6 -0
- package/dist/interval/calculate/intersectIntervals.d.ts +23 -0
- package/dist/interval/calculate/intersectIntervals.js +43 -0
- package/dist/interval/calculate/mergeIntervals.d.ts +28 -0
- package/dist/interval/calculate/mergeIntervals.js +44 -0
- package/dist/interval/calculate/splitIntervalAt.d.ts +28 -0
- package/dist/interval/calculate/splitIntervalAt.js +63 -0
- package/dist/interval/calculate/subtractIntervals.d.ts +31 -0
- package/dist/interval/calculate/subtractIntervals.js +64 -0
- package/dist/interval/calculate/sumIntervals.d.ts +26 -0
- package/dist/interval/calculate/sumIntervals.js +40 -0
- package/dist/interval/compare/index.d.ts +2 -0
- package/dist/interval/compare/index.js +2 -0
- package/dist/interval/compare/intervalContains.d.ts +25 -0
- package/dist/interval/compare/intervalContains.js +39 -0
- package/dist/interval/compare/intervalsOverlap.d.ts +28 -0
- package/dist/interval/compare/intervalsOverlap.js +42 -0
- package/dist/interval/index.d.ts +4 -0
- package/dist/interval/index.js +5 -0
- package/dist/interval/validate/index.d.ts +1 -0
- package/dist/interval/validate/index.js +1 -0
- package/dist/interval/validate/isValidInterval.d.ts +29 -0
- package/dist/interval/validate/isValidInterval.js +38 -0
- package/dist/plain/calculate/addBusinessDays.d.ts +26 -9
- package/dist/plain/calculate/addBusinessDays.js +29 -21
- package/dist/plain/calculate/addDate.d.ts +9 -8
- package/dist/plain/calculate/addDate.js +35 -22
- package/dist/plain/calculate/addDateTime.js +24 -10
- package/dist/plain/calculate/addTime.d.ts +5 -8
- package/dist/plain/calculate/addTime.js +23 -16
- package/dist/plain/calculate/clampDate.js +3 -3
- package/dist/plain/calculate/closestDateTo.d.ts +11 -7
- package/dist/plain/calculate/closestDateTo.js +36 -24
- package/dist/plain/calculate/cycleDate.d.ts +1 -1
- package/dist/plain/calculate/cycleDate.js +10 -3
- package/dist/plain/calculate/cycleDateTime.d.ts +1 -1
- package/dist/plain/calculate/cycleDateTime.js +10 -3
- package/dist/plain/calculate/cycleTime.d.ts +6 -8
- package/dist/plain/calculate/cycleTime.js +15 -9
- package/dist/plain/calculate/diffDate.d.ts +31 -14
- package/dist/plain/calculate/diffDate.js +73 -38
- package/dist/plain/calculate/diffDateAsDuration.d.ts +13 -8
- package/dist/plain/calculate/diffDateAsDuration.js +22 -9
- package/dist/plain/calculate/diffDateTime.d.ts +17 -5
- package/dist/plain/calculate/diffDateTime.js +67 -28
- package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +2 -2
- package/dist/plain/calculate/diffDateTimeAsDuration.js +10 -3
- package/dist/plain/calculate/diffTime.d.ts +18 -5
- package/dist/plain/calculate/diffTime.js +68 -27
- package/dist/plain/calculate/endOfDate.d.ts +10 -2
- package/dist/plain/calculate/endOfDate.js +52 -27
- package/dist/plain/calculate/endOfDateTime.d.ts +17 -2
- package/dist/plain/calculate/endOfDateTime.js +126 -103
- package/dist/plain/calculate/endOfTime.d.ts +16 -2
- package/dist/plain/calculate/endOfTime.js +77 -59
- package/dist/plain/calculate/getLargestDateDurationUnit.d.ts +13 -5
- package/dist/plain/calculate/getLargestDateDurationUnit.js +26 -10
- package/dist/plain/calculate/getLargestDateTimeDurationUnit.d.ts +13 -6
- package/dist/plain/calculate/getLargestDateTimeDurationUnit.js +37 -22
- package/dist/plain/calculate/getLargestTimeDurationUnit.d.ts +13 -6
- package/dist/plain/calculate/getLargestTimeDurationUnit.js +33 -18
- package/dist/plain/calculate/getLocaleDayOfWeek.d.ts +8 -4
- package/dist/plain/calculate/getLocaleDayOfWeek.js +8 -3
- package/dist/plain/calculate/getLocaleEndOfWeek.d.ts +8 -4
- package/dist/plain/calculate/getLocaleEndOfWeek.js +8 -3
- package/dist/plain/calculate/getLocaleStartOfWeek.d.ts +8 -4
- package/dist/plain/calculate/getLocaleStartOfWeek.js +8 -3
- package/dist/plain/calculate/getLocaleWeekYear.d.ts +29 -19
- package/dist/plain/calculate/getLocaleWeekYear.js +48 -28
- package/dist/plain/calculate/getWeekNumber.d.ts +21 -2
- package/dist/plain/calculate/getWeekNumber.js +33 -12
- package/dist/plain/calculate/getWeekOfMonth.d.ts +4 -2
- package/dist/plain/calculate/getWeekOfMonth.js +8 -3
- package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +25 -14
- package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +45 -25
- package/dist/plain/calculate/getWeeksInMonth.d.ts +4 -2
- package/dist/plain/calculate/getWeeksInMonth.js +8 -3
- package/dist/plain/calculate/getWeeksInYear.d.ts +5 -4
- package/dist/plain/calculate/getWeeksInYear.js +9 -14
- package/dist/plain/calculate/maxDate.js +19 -12
- package/dist/plain/calculate/maxDateTime.js +19 -12
- package/dist/plain/calculate/maxTime.js +19 -12
- package/dist/plain/calculate/minDate.js +19 -12
- package/dist/plain/calculate/minDateTime.js +19 -12
- package/dist/plain/calculate/minTime.js +19 -12
- package/dist/plain/calculate/nextWeekday.js +5 -0
- package/dist/plain/calculate/previousWeekday.js +5 -0
- package/dist/plain/calculate/roundDate.d.ts +23 -5
- package/dist/plain/calculate/roundDate.js +88 -46
- package/dist/plain/calculate/roundDateTime.d.ts +27 -3
- package/dist/plain/calculate/roundDateTime.js +128 -69
- package/dist/plain/calculate/roundTime.d.ts +8 -1
- package/dist/plain/calculate/roundTime.js +32 -17
- package/dist/plain/calculate/setDate.js +4 -0
- package/dist/plain/calculate/setDateTime.js +4 -0
- package/dist/plain/calculate/setTime.d.ts +1 -1
- package/dist/plain/calculate/setTime.js +5 -1
- package/dist/plain/calculate/sortDateTimes.js +17 -10
- package/dist/plain/calculate/sortDates.js +17 -10
- package/dist/plain/calculate/sortTimes.js +17 -10
- package/dist/plain/calculate/startOfDate.d.ts +7 -2
- package/dist/plain/calculate/startOfDate.js +52 -27
- package/dist/plain/calculate/startOfDateTime.d.ts +5 -2
- package/dist/plain/calculate/startOfDateTime.js +81 -62
- package/dist/plain/calculate/startOfQuarterForDateTime.d.ts +2 -0
- package/dist/plain/calculate/startOfQuarterForDateTime.js +12 -1
- package/dist/plain/calculate/startOfTime.d.ts +15 -2
- package/dist/plain/calculate/startOfTime.js +33 -37
- package/dist/plain/calculate/subtractBusinessDays.d.ts +25 -10
- package/dist/plain/calculate/subtractBusinessDays.js +28 -22
- package/dist/plain/calculate/subtractDate.d.ts +8 -7
- package/dist/plain/calculate/subtractDate.js +35 -21
- package/dist/plain/calculate/subtractDateTime.js +24 -10
- package/dist/plain/calculate/subtractTime.d.ts +5 -8
- package/dist/plain/calculate/subtractTime.js +23 -16
- package/dist/plain/chop/index.d.ts +0 -1
- package/dist/plain/chop/index.js +0 -1
- package/dist/plain/compare/areDateTimesEqualBy.d.ts +10 -5
- package/dist/plain/compare/areDateTimesEqualBy.js +35 -10
- package/dist/plain/compare/areDatesEqualBy.d.ts +10 -3
- package/dist/plain/compare/areDatesEqualBy.js +41 -14
- package/dist/plain/compare/isBetweenDate.js +32 -16
- package/dist/plain/compare/isBetweenDateTime.js +34 -18
- package/dist/plain/compare/isBetweenTime.js +32 -16
- package/dist/plain/compare/isBusinessDay.d.ts +25 -11
- package/dist/plain/compare/isBusinessDay.js +36 -15
- package/dist/plain/compare/isThisUnit.d.ts +13 -4
- package/dist/plain/compare/isThisUnit.js +33 -13
- package/dist/plain/compare/isWeekend.d.ts +8 -4
- package/dist/plain/compare/isWeekend.js +7 -3
- package/dist/plain/convert/convertDateToCalendar.d.ts +34 -33
- package/dist/plain/convert/convertDateToCalendar.js +41 -40
- package/dist/plain/format/formatCalendar.d.ts +12 -6
- package/dist/plain/format/formatCalendar.js +47 -25
- package/dist/plain/format/formatDate.d.ts +21 -4
- package/dist/plain/format/formatDate.js +37 -5
- package/dist/plain/format/formatDateRange.d.ts +17 -4
- package/dist/plain/format/formatDateRange.js +29 -5
- package/dist/plain/format/formatDateTime.d.ts +22 -4
- package/dist/plain/format/formatDateTime.js +31 -5
- package/dist/plain/format/formatDateTimeRange.d.ts +20 -4
- package/dist/plain/format/formatDateTimeRange.js +29 -5
- package/dist/plain/format/formatDateTimeToParts.d.ts +32 -6
- package/dist/plain/format/formatDateTimeToParts.js +40 -14
- package/dist/plain/format/formatDateToParts.d.ts +24 -3
- package/dist/plain/format/formatDateToParts.js +36 -11
- package/dist/plain/format/formatRelativeDate.d.ts +7 -3
- package/dist/plain/format/formatRelativeDate.js +39 -24
- package/dist/plain/format/formatRelativeDateTime.d.ts +15 -6
- package/dist/plain/format/formatRelativeDateTime.js +35 -33
- package/dist/plain/format/formatRelativeTime.d.ts +8 -4
- package/dist/plain/format/formatRelativeTime.js +36 -21
- package/dist/plain/format/formatSql.d.ts +15 -10
- package/dist/plain/format/formatSql.js +20 -11
- package/dist/plain/format/formatTime.d.ts +18 -4
- package/dist/plain/format/formatTime.js +32 -5
- package/dist/plain/get/getNowUnit.d.ts +3 -0
- package/dist/plain/get/getNowUnit.js +14 -29
- package/dist/plain/index.js +1 -1
- package/dist/plain/interval/intervalAbutsDate.d.ts +12 -7
- package/dist/plain/interval/intervalAbutsDate.js +15 -19
- package/dist/plain/interval/intervalAbutsDateTime.d.ts +9 -7
- package/dist/plain/interval/intervalAbutsDateTime.js +17 -23
- package/dist/plain/interval/intervalAbutsTime.d.ts +11 -5
- package/dist/plain/interval/intervalAbutsTime.js +19 -21
- package/dist/plain/interval/intervalContainsDate.d.ts +17 -10
- package/dist/plain/interval/intervalContainsDate.js +20 -15
- package/dist/plain/interval/intervalContainsDateTime.d.ts +16 -11
- package/dist/plain/interval/intervalContainsDateTime.js +24 -20
- package/dist/plain/interval/intervalContainsTime.d.ts +20 -10
- package/dist/plain/interval/intervalContainsTime.js +28 -19
- package/dist/plain/interval/intervalCountDate.d.ts +13 -8
- package/dist/plain/interval/intervalCountDate.js +46 -14
- package/dist/plain/interval/intervalCountDateTime.d.ts +6 -4
- package/dist/plain/interval/intervalCountDateTime.js +63 -18
- package/dist/plain/interval/intervalCountTime.d.ts +3 -4
- package/dist/plain/interval/intervalCountTime.js +9 -9
- package/dist/plain/interval/intervalDifferenceDate.d.ts +13 -6
- package/dist/plain/interval/intervalDifferenceDate.js +19 -32
- package/dist/plain/interval/intervalDifferenceDateTime.d.ts +10 -4
- package/dist/plain/interval/intervalDifferenceDateTime.js +21 -27
- package/dist/plain/interval/intervalDifferenceTime.d.ts +11 -4
- package/dist/plain/interval/intervalDifferenceTime.js +22 -27
- package/dist/plain/interval/intervalDivideEquallyDate.d.ts +16 -4
- package/dist/plain/interval/intervalDivideEquallyDate.js +57 -33
- package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +16 -4
- package/dist/plain/interval/intervalDivideEquallyDateTime.js +67 -31
- package/dist/plain/interval/intervalDivideEquallyTime.d.ts +16 -4
- package/dist/plain/interval/intervalDivideEquallyTime.js +58 -31
- package/dist/plain/interval/intervalEngulfsDate.d.ts +16 -9
- package/dist/plain/interval/intervalEngulfsDate.js +19 -12
- package/dist/plain/interval/intervalEngulfsDateTime.d.ts +16 -11
- package/dist/plain/interval/intervalEngulfsDateTime.js +24 -18
- package/dist/plain/interval/intervalEngulfsTime.d.ts +18 -8
- package/dist/plain/interval/intervalEngulfsTime.js +26 -15
- package/dist/plain/interval/intervalFromDurationDate.d.ts +5 -4
- package/dist/plain/interval/intervalFromDurationDate.js +11 -8
- package/dist/plain/interval/intervalFromDurationDateTime.js +4 -0
- package/dist/plain/interval/intervalFromDurationTime.d.ts +10 -12
- package/dist/plain/interval/intervalFromDurationTime.js +28 -17
- package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -4
- package/dist/plain/interval/intervalIntersectionDate.js +14 -9
- package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -4
- package/dist/plain/interval/intervalIntersectionDateTime.js +19 -13
- package/dist/plain/interval/intervalIntersectionTime.d.ts +7 -3
- package/dist/plain/interval/intervalIntersectionTime.js +17 -12
- package/dist/plain/interval/intervalLengthDate.d.ts +9 -6
- package/dist/plain/interval/intervalLengthDate.js +40 -8
- package/dist/plain/interval/intervalLengthDateTime.js +2 -2
- package/dist/plain/interval/intervalOverlappingDaysDate.d.ts +16 -17
- package/dist/plain/interval/intervalOverlappingDaysDate.js +30 -30
- package/dist/plain/interval/intervalOverlappingDaysDateTime.d.ts +7 -12
- package/dist/plain/interval/intervalOverlappingDaysDateTime.js +24 -24
- package/dist/plain/interval/intervalSplitAtDate.d.ts +10 -5
- package/dist/plain/interval/intervalSplitAtDate.js +48 -36
- package/dist/plain/interval/intervalSplitAtDateTime.d.ts +9 -4
- package/dist/plain/interval/intervalSplitAtDateTime.js +44 -32
- package/dist/plain/interval/intervalSplitAtTime.d.ts +9 -4
- package/dist/plain/interval/intervalSplitAtTime.js +44 -32
- package/dist/plain/interval/intervalUnionDate.d.ts +14 -6
- package/dist/plain/interval/intervalUnionDate.js +19 -11
- package/dist/plain/interval/intervalUnionDateTime.d.ts +12 -5
- package/dist/plain/interval/intervalUnionDateTime.js +22 -14
- package/dist/plain/interval/intervalUnionTime.d.ts +10 -3
- package/dist/plain/interval/intervalUnionTime.js +20 -12
- package/dist/plain/interval/intervalXorAllDate.d.ts +11 -10
- package/dist/plain/interval/intervalXorAllDate.js +37 -59
- package/dist/plain/interval/intervalXorAllDateTime.d.ts +7 -5
- package/dist/plain/interval/intervalXorAllDateTime.js +28 -48
- package/dist/plain/interval/intervalXorAllTime.d.ts +8 -4
- package/dist/plain/interval/intervalXorAllTime.js +29 -47
- package/dist/plain/interval/intervalXorDate.d.ts +10 -9
- package/dist/plain/interval/intervalXorDate.js +19 -54
- package/dist/plain/interval/intervalXorDateTime.d.ts +9 -7
- package/dist/plain/interval/intervalXorDateTime.js +23 -50
- package/dist/plain/interval/intervalXorTime.d.ts +8 -7
- package/dist/plain/interval/intervalXorTime.js +22 -50
- package/dist/plain/interval/intervalsOverlapDate.d.ts +14 -7
- package/dist/plain/interval/intervalsOverlapDate.js +17 -10
- package/dist/plain/interval/intervalsOverlapDateTime.d.ts +12 -7
- package/dist/plain/interval/intervalsOverlapDateTime.js +20 -14
- package/dist/plain/interval/intervalsOverlapTime.d.ts +10 -5
- package/dist/plain/interval/intervalsOverlapTime.js +18 -12
- package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -5
- package/dist/plain/interval/mergeIntervalsDate.js +37 -38
- package/dist/plain/interval/mergeIntervalsDateTime.d.ts +7 -3
- package/dist/plain/interval/mergeIntervalsDateTime.js +31 -32
- package/dist/plain/interval/mergeIntervalsTime.d.ts +7 -3
- package/dist/plain/interval/mergeIntervalsTime.js +31 -31
- package/dist/plain/interval/splitIntervalByUnitDate.d.ts +26 -6
- package/dist/plain/interval/splitIntervalByUnitDate.js +76 -43
- package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -2
- package/dist/plain/interval/splitIntervalByUnitDateTime.js +65 -39
- package/dist/plain/interval/splitIntervalByUnitTime.d.ts +18 -2
- package/dist/plain/interval/splitIntervalByUnitTime.js +76 -39
- package/dist/plain/interval/validate/isValidDateInterval.d.ts +4 -2
- package/dist/plain/interval/validate/isValidDateInterval.js +4 -2
- package/dist/plain/interval/validate/isValidDateTimeInterval.d.ts +5 -0
- package/dist/plain/interval/validate/isValidDateTimeInterval.js +7 -2
- package/dist/plain/interval/validate/isValidTimeInterval.d.ts +5 -0
- package/dist/plain/interval/validate/isValidTimeInterval.js +8 -18
- package/dist/plain/locale/getLocaleEraNames.d.ts +14 -4
- package/dist/plain/locale/getLocaleEraNames.js +56 -41
- package/dist/plain/locale/getLocaleMeridiems.d.ts +7 -4
- package/dist/plain/locale/getLocaleMeridiems.js +28 -22
- package/dist/plain/locale/getLocaleMonthNames.d.ts +14 -4
- package/dist/plain/locale/getLocaleMonthNames.js +34 -19
- package/dist/plain/locale/getLocaleWeekdayNames.d.ts +14 -7
- package/dist/plain/locale/getLocaleWeekdayNames.js +40 -22
- package/dist/plain/map/mapDatesInRange.d.ts +18 -1
- package/dist/plain/map/mapDatesInRange.js +53 -17
- package/dist/plain/parse/parseDateTimeWithPattern.d.ts +3 -2
- package/dist/plain/parse/parseDateTimeWithPattern.js +30 -24
- package/dist/plain/parse/parseDateWithPattern.d.ts +3 -2
- package/dist/plain/parse/parseDateWithPattern.js +22 -16
- package/dist/plain/parse/parseMicrosecondFromDateTime.d.ts +2 -1
- package/dist/plain/parse/parseMicrosecondFromDateTime.js +2 -1
- package/dist/plain/parse/parseMicrosecondFromTime.d.ts +2 -1
- package/dist/plain/parse/parseMicrosecondFromTime.js +2 -1
- package/dist/plain/parse/parseNanosecondFromDateTime.d.ts +2 -1
- package/dist/plain/parse/parseNanosecondFromDateTime.js +2 -1
- package/dist/plain/parse/parseNanosecondFromTime.d.ts +2 -1
- package/dist/plain/parse/parseNanosecondFromTime.js +2 -1
- package/dist/plain/parse/parseSql.d.ts +15 -12
- package/dist/plain/parse/parseSql.js +16 -13
- package/dist/plain/parse/parseTimeWithPattern.d.ts +3 -2
- package/dist/plain/parse/parseTimeWithPattern.js +27 -21
- package/dist/plain/parse/parseUnitFromDate.d.ts +9 -2
- package/dist/plain/parse/parseUnitFromDate.js +39 -19
- package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
- package/dist/plain/parse/parseUnitFromDateTime.js +54 -28
- package/dist/plain/parse/parseUnitFromTime.d.ts +9 -3
- package/dist/plain/parse/parseUnitFromTime.js +13 -3
- package/dist/plain/parse/parseWeekFromDate.d.ts +5 -0
- package/dist/plain/parse/parseWeekFromDate.js +24 -5
- package/dist/plain/parse/parseWeekFromDateTime.d.ts +5 -0
- package/dist/plain/parse/parseWeekFromDateTime.js +26 -5
- package/dist/plain/validate/isLeapSecond.d.ts +27 -9
- package/dist/plain/validate/isLeapSecond.js +30 -9
- package/dist/plain/validate/isLeapYear.d.ts +7 -1
- package/dist/plain/validate/isLeapYear.js +10 -1
- package/dist/plain/validate/isValidCalendarDate.d.ts +37 -6
- package/dist/plain/validate/isValidCalendarDate.js +37 -6
- package/dist/plain/validate/isValidDate.d.ts +9 -1
- package/dist/plain/validate/isValidDate.js +14 -5
- package/dist/plain/validate/isValidDateRange.d.ts +11 -4
- package/dist/plain/validate/isValidDateRange.js +32 -22
- package/dist/plain/validate/isValidDateTime.d.ts +7 -1
- package/dist/plain/validate/isValidDateTime.js +12 -5
- package/dist/plain/validate/isValidDateTimeRange.d.ts +3 -2
- package/dist/plain/validate/isValidDateTimeRange.js +30 -15
- package/dist/plain/validate/isValidIsoDateLike.d.ts +6 -1
- package/dist/plain/validate/isValidIsoDateLike.js +13 -8
- package/dist/plain/validate/isValidTime.d.ts +6 -1
- package/dist/plain/validate/isValidTime.js +10 -3
- package/dist/plain/validate/isValidTimeRange.d.ts +4 -2
- package/dist/plain/validate/isValidTimeRange.js +31 -27
- package/dist/precision/calculate/index.d.ts +1 -0
- package/dist/precision/calculate/index.js +1 -0
- package/dist/precision/calculate/truncateNanoseconds.d.ts +37 -0
- package/dist/precision/calculate/truncateNanoseconds.js +41 -0
- package/dist/precision/convert/fromDotNetTicks.d.ts +30 -0
- package/dist/precision/convert/fromDotNetTicks.js +39 -0
- package/dist/precision/convert/fromExcelSerial.d.ts +38 -0
- package/dist/precision/convert/fromExcelSerial.js +81 -0
- package/dist/precision/convert/fromFileTime.d.ts +30 -0
- package/dist/precision/convert/fromFileTime.js +39 -0
- package/dist/precision/convert/fromNanoseconds.d.ts +29 -0
- package/dist/precision/convert/fromNanoseconds.js +50 -0
- package/dist/precision/convert/fromNtpTimestamp.d.ts +43 -0
- package/dist/precision/convert/fromNtpTimestamp.js +57 -0
- package/dist/precision/convert/fromPgMicroseconds.d.ts +26 -0
- package/dist/precision/convert/fromPgMicroseconds.js +33 -0
- package/dist/precision/convert/index.d.ts +12 -0
- package/dist/precision/convert/index.js +12 -0
- package/dist/precision/convert/toDotNetTicks.d.ts +29 -0
- package/dist/precision/convert/toDotNetTicks.js +40 -0
- package/dist/precision/convert/toExcelSerial.d.ts +56 -0
- package/dist/precision/convert/toExcelSerial.js +85 -0
- package/dist/precision/convert/toFileTime.d.ts +31 -0
- package/dist/precision/convert/toFileTime.js +43 -0
- package/dist/precision/convert/toNanoseconds.d.ts +37 -0
- package/dist/precision/convert/toNanoseconds.js +40 -0
- package/dist/precision/convert/toNtpTimestamp.d.ts +30 -0
- package/dist/precision/convert/toNtpTimestamp.js +38 -0
- package/dist/precision/convert/toPgMicroseconds.d.ts +29 -0
- package/dist/precision/convert/toPgMicroseconds.js +42 -0
- package/dist/precision/format/formatNanoseconds.d.ts +26 -0
- package/dist/precision/format/formatNanoseconds.js +32 -0
- package/dist/precision/format/index.d.ts +1 -0
- package/dist/precision/format/index.js +1 -0
- package/dist/precision/index.d.ts +6 -0
- package/dist/precision/index.js +7 -0
- package/dist/precision/parse/index.d.ts +1 -0
- package/dist/precision/parse/index.js +1 -0
- package/dist/precision/parse/parseNanoseconds.d.ts +27 -0
- package/dist/precision/parse/parseNanoseconds.js +32 -0
- package/dist/precision/validate/index.d.ts +3 -0
- package/dist/precision/validate/index.js +3 -0
- package/dist/precision/validate/isValidInstant.d.ts +37 -0
- package/dist/precision/validate/isValidInstant.js +40 -0
- package/dist/precision/validate/isValidNanoPattern.d.ts +27 -0
- package/dist/precision/validate/isValidNanoPattern.js +40 -0
- package/dist/precision/validate/isValidNanoseconds.d.ts +25 -0
- package/dist/precision/validate/isValidNanoseconds.js +28 -0
- package/dist/regex/calendar-date.d.ts +25 -14
- package/dist/regex/calendar-date.js +26 -15
- package/dist/regex/calendar-zoned-date-time.d.ts +22 -38
- package/dist/regex/calendar-zoned-date-time.js +23 -39
- package/dist/regex/date-time.d.ts +14 -4
- package/dist/regex/date-time.js +15 -5
- package/dist/regex/date.d.ts +45 -3
- package/dist/regex/date.js +47 -5
- package/dist/regex/http-date.d.ts +10 -6
- package/dist/regex/http-date.js +10 -6
- package/dist/regex/index.d.ts +3 -0
- package/dist/regex/index.js +4 -0
- package/dist/regex/leap-second.d.ts +41 -8
- package/dist/regex/leap-second.js +42 -9
- package/dist/regex/nanoseconds.d.ts +20 -0
- package/dist/regex/nanoseconds.js +20 -0
- package/dist/regex/rfc-2822.d.ts +15 -7
- package/dist/regex/rfc-2822.js +15 -7
- package/dist/regex/rfc-3339.d.ts +8 -1
- package/dist/regex/rfc-3339.js +9 -2
- package/dist/regex/sql-date-time.d.ts +27 -8
- package/dist/regex/sql-date-time.js +28 -9
- package/dist/regex/time-zone-like.d.ts +24 -15
- package/dist/regex/time-zone-like.js +25 -16
- package/dist/regex/time.d.ts +20 -6
- package/dist/regex/time.js +20 -6
- package/dist/regex/unix.d.ts +13 -5
- package/dist/regex/unix.js +13 -5
- package/dist/regex/utc-date-time.d.ts +19 -9
- package/dist/regex/utc-date-time.js +20 -10
- package/dist/regex/utc-offset.d.ts +24 -0
- package/dist/regex/utc-offset.js +24 -0
- package/dist/span/calculate/index.d.ts +3 -0
- package/dist/span/calculate/index.js +3 -0
- package/dist/span/calculate/spanMs.d.ts +52 -0
- package/dist/span/calculate/spanMs.js +80 -0
- package/dist/span/calculate/spanNs.d.ts +43 -0
- package/dist/span/calculate/spanNs.js +51 -0
- package/dist/span/calculate/spanWallClock.d.ts +60 -0
- package/dist/span/calculate/spanWallClock.js +80 -0
- package/dist/span/index.d.ts +3 -0
- package/dist/span/index.js +4 -0
- package/dist/span/validate/index.d.ts +1 -0
- package/dist/span/validate/index.js +1 -0
- package/dist/span/validate/isValidSpan.d.ts +37 -0
- package/dist/span/validate/isValidSpan.js +41 -0
- package/dist/transport/calculate/dwellTime.d.ts +72 -0
- package/dist/transport/calculate/dwellTime.js +126 -0
- package/dist/transport/calculate/index.d.ts +2 -0
- package/dist/transport/calculate/index.js +2 -0
- package/dist/transport/calculate/transitTime.d.ts +53 -0
- package/dist/transport/calculate/transitTime.js +118 -0
- package/dist/transport/convert/etaAtZone.d.ts +36 -0
- package/dist/transport/convert/etaAtZone.js +53 -0
- package/dist/transport/convert/index.d.ts +1 -0
- package/dist/transport/convert/index.js +1 -0
- package/dist/transport/index.d.ts +3 -0
- package/dist/transport/index.js +4 -0
- package/dist/types/business-calendar.d.ts +27 -0
- package/dist/types/business-calendar.js +0 -0
- package/dist/types/calendar-system.d.ts +9 -1
- package/dist/types/fiscal-calendar.d.ts +22 -0
- package/dist/types/fiscal-calendar.js +0 -0
- package/dist/types/free-time-options.d.ts +34 -0
- package/dist/types/free-time-options.js +0 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.js +6 -0
- package/dist/types/interval.d.ts +18 -0
- package/dist/types/interval.js +0 -0
- package/dist/types/now-unit.d.ts +1 -1
- package/dist/types/roll-convention.d.ts +32 -0
- package/dist/types/roll-convention.js +0 -0
- package/dist/types/utc-now-unit.d.ts +1 -1
- package/dist/types/zone-bucket-unit.d.ts +11 -0
- package/dist/types/zone-bucket-unit.js +0 -0
- package/dist/unix/calculate/addUnix.d.ts +10 -4
- package/dist/unix/calculate/addUnix.js +39 -26
- package/dist/unix/calculate/diffUnix.d.ts +38 -11
- package/dist/unix/calculate/diffUnix.js +84 -40
- package/dist/unix/calculate/diffUnixAsDuration.d.ts +17 -7
- package/dist/unix/calculate/diffUnixAsDuration.js +42 -23
- package/dist/unix/calculate/endOfQuarterForUnix.d.ts +15 -11
- package/dist/unix/calculate/endOfQuarterForUnix.js +20 -39
- package/dist/unix/calculate/endOfUnix.d.ts +23 -18
- package/dist/unix/calculate/endOfUnix.js +37 -15
- package/dist/unix/calculate/isBetweenUnix.d.ts +12 -6
- package/dist/unix/calculate/isBetweenUnix.js +34 -23
- package/dist/unix/calculate/maxUnix.d.ts +6 -3
- package/dist/unix/calculate/maxUnix.js +17 -8
- package/dist/unix/calculate/minUnix.d.ts +6 -3
- package/dist/unix/calculate/minUnix.js +17 -8
- package/dist/unix/calculate/roundUnix.d.ts +24 -10
- package/dist/unix/calculate/roundUnix.js +67 -42
- package/dist/unix/calculate/setUnix.d.ts +14 -5
- package/dist/unix/calculate/setUnix.js +48 -29
- package/dist/unix/calculate/sortUnix.d.ts +6 -3
- package/dist/unix/calculate/sortUnix.js +19 -11
- package/dist/unix/calculate/startOfQuarterForUnix.d.ts +17 -12
- package/dist/unix/calculate/startOfQuarterForUnix.js +22 -30
- package/dist/unix/calculate/startOfUnix.d.ts +23 -18
- package/dist/unix/calculate/startOfUnix.js +37 -15
- package/dist/unix/calculate/subtractUnix.d.ts +10 -4
- package/dist/unix/calculate/subtractUnix.js +39 -26
- package/dist/unix/compare/areUnixEqual.d.ts +9 -5
- package/dist/unix/compare/areUnixEqual.js +17 -13
- package/dist/unix/compare/areUnixEqualBy.d.ts +14 -7
- package/dist/unix/compare/areUnixEqualBy.js +14 -7
- package/dist/unix/compare/isAfterUnix.d.ts +8 -4
- package/dist/unix/compare/isAfterUnix.js +16 -12
- package/dist/unix/compare/isBeforeUnix.d.ts +7 -4
- package/dist/unix/compare/isBeforeUnix.js +15 -12
- package/dist/unix/convert/convertUnixToPlainDate.d.ts +17 -9
- package/dist/unix/convert/convertUnixToPlainDate.js +34 -21
- package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +15 -9
- package/dist/unix/convert/convertUnixToPlainDateTime.js +32 -21
- package/dist/unix/convert/convertUnixToPlainTime.d.ts +15 -9
- package/dist/unix/convert/convertUnixToPlainTime.js +32 -21
- package/dist/unix/convert/convertUnixToUtc.d.ts +15 -7
- package/dist/unix/convert/convertUnixToUtc.js +20 -15
- package/dist/unix/convert/convertUnixToZoned.d.ts +17 -10
- package/dist/unix/convert/convertUnixToZoned.js +31 -20
- package/dist/unix/format/formatCalendarUnix.d.ts +22 -19
- package/dist/unix/format/formatCalendarUnix.js +35 -81
- package/dist/unix/format/formatRelativeUnix.d.ts +25 -8
- package/dist/unix/format/formatRelativeUnix.js +46 -93
- package/dist/unix/format/formatUnix.d.ts +26 -4
- package/dist/unix/format/formatUnix.js +48 -34
- package/dist/unix/get/getUnixNow.d.ts +13 -7
- package/dist/unix/get/getUnixNow.js +27 -17
- package/dist/unix/get/getUnixNowUnit.d.ts +5 -2
- package/dist/unix/get/getUnixNowUnit.js +9 -35
- package/dist/unix/index.d.ts +1 -0
- package/dist/unix/index.js +2 -0
- package/dist/unix/interval/intervalAbutsUnix.d.ts +17 -12
- package/dist/unix/interval/intervalAbutsUnix.js +23 -41
- package/dist/unix/interval/intervalContainsUnix.d.ts +17 -7
- package/dist/unix/interval/intervalContainsUnix.js +25 -37
- package/dist/unix/interval/intervalCountUnix.d.ts +30 -13
- package/dist/unix/interval/intervalCountUnix.js +49 -23
- package/dist/unix/interval/intervalDifferenceUnix.d.ts +19 -10
- package/dist/unix/interval/intervalDifferenceUnix.js +25 -43
- package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +24 -10
- package/dist/unix/interval/intervalDivideEquallyUnix.js +57 -36
- package/dist/unix/interval/intervalEngulfsUnix.d.ts +13 -7
- package/dist/unix/interval/intervalEngulfsUnix.js +18 -30
- package/dist/unix/interval/intervalFromDurationUnix.d.ts +10 -6
- package/dist/unix/interval/intervalFromDurationUnix.js +51 -39
- package/dist/unix/interval/intervalIntersectionUnix.d.ts +18 -11
- package/dist/unix/interval/intervalIntersectionUnix.js +25 -46
- package/dist/unix/interval/intervalLengthUnix.d.ts +21 -9
- package/dist/unix/interval/intervalLengthUnix.js +41 -18
- package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +26 -12
- package/dist/unix/interval/intervalOverlappingDaysUnix.js +67 -63
- package/dist/unix/interval/intervalSplitAtUnix.d.ts +11 -6
- package/dist/unix/interval/intervalSplitAtUnix.js +41 -34
- package/dist/unix/interval/intervalUnionUnix.d.ts +15 -9
- package/dist/unix/interval/intervalUnionUnix.js +20 -42
- package/dist/unix/interval/intervalXorAllUnix.d.ts +8 -6
- package/dist/unix/interval/intervalXorAllUnix.js +21 -56
- package/dist/unix/interval/intervalXorUnix.d.ts +22 -11
- package/dist/unix/interval/intervalXorUnix.js +28 -56
- package/dist/unix/interval/intervalsOverlapUnix.d.ts +16 -10
- package/dist/unix/interval/intervalsOverlapUnix.js +21 -37
- package/dist/unix/interval/mergeIntervalsUnix.d.ts +10 -4
- package/dist/unix/interval/mergeIntervalsUnix.js +25 -36
- package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +38 -8
- package/dist/unix/interval/splitIntervalByUnitUnix.js +72 -56
- package/dist/unix/interval/validate/isValidUnixInterval.d.ts +12 -6
- package/dist/unix/interval/validate/isValidUnixInterval.js +17 -16
- package/dist/unix/parse/index.d.ts +2 -0
- package/dist/unix/parse/index.js +2 -0
- package/dist/unix/parse/parseDateFromUnix.d.ts +10 -8
- package/dist/unix/parse/parseDateFromUnix.js +17 -29
- package/dist/unix/parse/parseDayFromUnix.d.ts +6 -4
- package/dist/unix/parse/parseDayFromUnix.js +18 -5
- package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +8 -5
- package/dist/unix/parse/parseDayOfWeekFromUnix.js +15 -28
- package/dist/unix/parse/parseHourFromUnix.d.ts +6 -4
- package/dist/unix/parse/parseHourFromUnix.js +18 -5
- package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMicrosecondFromUnix.js +16 -3
- package/dist/unix/parse/parseMillisecondFromUnix.d.ts +4 -2
- package/dist/unix/parse/parseMillisecondFromUnix.js +16 -3
- package/dist/unix/parse/parseMinuteFromUnix.d.ts +6 -4
- package/dist/unix/parse/parseMinuteFromUnix.js +18 -5
- package/dist/unix/parse/parseMonthFromUnix.d.ts +6 -4
- package/dist/unix/parse/parseMonthFromUnix.js +18 -5
- package/dist/unix/parse/parseNanosecondFromUnix.d.ts +8 -5
- package/dist/unix/parse/parseNanosecondFromUnix.js +20 -6
- package/dist/unix/parse/parseSecondFromUnix.d.ts +5 -3
- package/dist/unix/parse/parseSecondFromUnix.js +17 -4
- package/dist/unix/parse/parseTimeFromUnix.d.ts +10 -8
- package/dist/unix/parse/parseTimeFromUnix.js +17 -29
- package/dist/unix/parse/parseUnitFromUnix.d.ts +18 -11
- package/dist/unix/parse/parseUnitFromUnix.js +57 -55
- package/dist/unix/parse/parseWeekFromUnix.d.ts +15 -7
- package/dist/unix/parse/parseWeekFromUnix.js +32 -30
- package/dist/unix/parse/parseYearFromUnix.d.ts +5 -3
- package/dist/unix/parse/parseYearFromUnix.js +17 -4
- package/dist/unix/validate/isValidUnixMilliseconds.d.ts +8 -5
- package/dist/unix/validate/isValidUnixMilliseconds.js +10 -9
- package/dist/unix/validate/isValidUnixRange.d.ts +13 -7
- package/dist/unix/validate/isValidUnixRange.js +29 -19
- package/dist/unix/validate/isValidUnixSeconds.d.ts +8 -5
- package/dist/unix/validate/isValidUnixSeconds.js +10 -9
- package/dist/unix/validate/isValidUnixUnit.d.ts +9 -7
- package/dist/unix/validate/isValidUnixUnit.js +6 -8
- package/dist/utc/calculate/addUtc.js +26 -12
- package/dist/utc/calculate/diffUtc.d.ts +22 -7
- package/dist/utc/calculate/diffUtc.js +75 -31
- package/dist/utc/calculate/diffUtcAsDuration.d.ts +2 -2
- package/dist/utc/calculate/diffUtcAsDuration.js +10 -3
- package/dist/utc/calculate/endOfQuarterForUtc.d.ts +1 -1
- package/dist/utc/calculate/endOfQuarterForUtc.js +1 -1
- package/dist/utc/calculate/endOfUtc.d.ts +11 -4
- package/dist/utc/calculate/endOfUtc.js +22 -5
- package/dist/utc/calculate/isBetweenUtc.js +40 -24
- package/dist/utc/calculate/maxUtc.js +19 -12
- package/dist/utc/calculate/minUtc.js +19 -12
- package/dist/utc/calculate/roundUtc.d.ts +16 -2
- package/dist/utc/calculate/roundUtc.js +42 -31
- package/dist/utc/calculate/setUtc.d.ts +4 -8
- package/dist/utc/calculate/setUtc.js +25 -18
- package/dist/utc/calculate/sortUtc.js +17 -10
- package/dist/utc/calculate/startOfQuarterForUtc.d.ts +2 -0
- package/dist/utc/calculate/startOfQuarterForUtc.js +12 -1
- package/dist/utc/calculate/startOfUtc.d.ts +6 -4
- package/dist/utc/calculate/startOfUtc.js +17 -5
- package/dist/utc/calculate/subtractUtc.js +26 -12
- package/dist/utc/chop/chopUtc.d.ts +5 -2
- package/dist/utc/chop/chopUtc.js +8 -4
- package/dist/utc/compare/areUtcEqualBy.d.ts +10 -5
- package/dist/utc/compare/areUtcEqualBy.js +34 -11
- package/dist/utc/convert/convertUtcToPlainDate.js +22 -10
- package/dist/utc/convert/convertUtcToPlainDateTime.js +28 -16
- package/dist/utc/convert/convertUtcToPlainTime.js +22 -10
- package/dist/utc/convert/convertUtcToUnix.d.ts +12 -5
- package/dist/utc/convert/convertUtcToUnix.js +22 -13
- package/dist/utc/format/formatCalendarUtc.d.ts +11 -6
- package/dist/utc/format/formatCalendarUtc.js +32 -41
- package/dist/utc/format/formatHttp.d.ts +9 -3
- package/dist/utc/format/formatHttp.js +14 -12
- package/dist/utc/format/formatRelativeUtc.d.ts +18 -6
- package/dist/utc/format/formatRelativeUtc.js +43 -51
- package/dist/utc/format/formatUtc.d.ts +20 -3
- package/dist/utc/format/formatUtc.js +41 -12
- package/dist/utc/get/getUtcNowUnit.d.ts +3 -0
- package/dist/utc/get/getUtcNowUnit.js +11 -33
- package/dist/utc/index.d.ts +1 -0
- package/dist/utc/index.js +2 -0
- package/dist/utc/interval/intervalAbutsUtc.d.ts +10 -7
- package/dist/utc/interval/intervalAbutsUtc.js +18 -30
- package/dist/utc/interval/intervalContainsUtc.d.ts +19 -11
- package/dist/utc/interval/intervalContainsUtc.js +33 -34
- package/dist/utc/interval/intervalCountUtc.d.ts +3 -4
- package/dist/utc/interval/intervalCountUtc.js +12 -18
- package/dist/utc/interval/intervalDifferenceUtc.d.ts +13 -5
- package/dist/utc/interval/intervalDifferenceUtc.js +25 -51
- package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +16 -3
- package/dist/utc/interval/intervalDivideEquallyUtc.js +54 -34
- package/dist/utc/interval/intervalEngulfsUtc.d.ts +17 -12
- package/dist/utc/interval/intervalEngulfsUtc.js +25 -26
- package/dist/utc/interval/intervalFromDurationUtc.js +5 -0
- package/dist/utc/interval/intervalIntersectionUtc.d.ts +12 -6
- package/dist/utc/interval/intervalIntersectionUtc.js +24 -41
- package/dist/utc/interval/intervalLengthUtc.js +5 -7
- package/dist/utc/interval/intervalOverlappingDaysUtc.d.ts +7 -13
- package/dist/utc/interval/intervalOverlappingDaysUtc.js +25 -36
- package/dist/utc/interval/intervalSplitAtUtc.d.ts +7 -2
- package/dist/utc/interval/intervalSplitAtUtc.js +39 -33
- package/dist/utc/interval/intervalUnionUtc.d.ts +15 -7
- package/dist/utc/interval/intervalUnionUtc.js +31 -42
- package/dist/utc/interval/intervalXorAllUtc.d.ts +7 -4
- package/dist/utc/interval/intervalXorAllUtc.js +30 -52
- package/dist/utc/interval/intervalXorUtc.d.ts +8 -6
- package/dist/utc/interval/intervalXorUtc.js +22 -56
- package/dist/utc/interval/intervalsOverlapUtc.d.ts +15 -9
- package/dist/utc/interval/intervalsOverlapUtc.js +23 -39
- package/dist/utc/interval/mergeIntervalsUtc.d.ts +9 -2
- package/dist/utc/interval/mergeIntervalsUtc.js +23 -36
- package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +23 -2
- package/dist/utc/interval/splitIntervalByUnitUtc.js +65 -44
- package/dist/utc/interval/validate/isValidUtcInterval.d.ts +5 -0
- package/dist/utc/interval/validate/isValidUtcInterval.js +7 -6
- package/dist/utc/parse/parseDateFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseDateFromUtc.js +14 -9
- package/dist/utc/parse/parseDayFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseDayFromUtc.js +14 -8
- package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseDayOfWeekFromUtc.js +24 -6
- package/dist/utc/parse/parseHourFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseHourFromUtc.js +14 -8
- package/dist/utc/parse/parseHttp.d.ts +39 -14
- package/dist/utc/parse/parseHttp.js +69 -28
- package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +9 -2
- package/dist/utc/parse/parseMicrosecondFromUtc.js +18 -9
- package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseMillisecondFromUtc.js +16 -8
- package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseMinuteFromUtc.js +14 -8
- package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseMonthFromUtc.js +14 -8
- package/dist/utc/parse/parseNanosecondFromUtc.d.ts +9 -2
- package/dist/utc/parse/parseNanosecondFromUtc.js +18 -9
- package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseSecondFromUtc.js +14 -8
- package/dist/utc/parse/parseTimeFromUtc.js +21 -10
- package/dist/utc/parse/parseUnitFromUtc.d.ts +18 -7
- package/dist/utc/parse/parseUnitFromUtc.js +58 -31
- package/dist/utc/parse/parseWeekFromUtc.d.ts +16 -3
- package/dist/utc/parse/parseWeekFromUtc.js +38 -10
- package/dist/utc/parse/parseYearFromUtc.d.ts +7 -1
- package/dist/utc/parse/parseYearFromUtc.js +14 -8
- package/dist/utc/validate/isValidUtc.d.ts +8 -1
- package/dist/utc/validate/isValidUtc.js +12 -3
- package/dist/utc/validate/isValidUtcRange.d.ts +3 -2
- package/dist/utc/validate/isValidUtcRange.js +30 -19
- package/dist/zoned/calculate/addZoned.d.ts +40 -27
- package/dist/zoned/calculate/addZoned.js +71 -56
- package/dist/zoned/calculate/addZonedBusinessDays.d.ts +2 -0
- package/dist/zoned/calculate/addZonedBusinessDays.js +5 -2
- package/dist/zoned/calculate/clampZoned.js +4 -3
- package/dist/zoned/calculate/closestZonedTo.d.ts +6 -6
- package/dist/zoned/calculate/closestZonedTo.js +35 -26
- package/dist/zoned/calculate/cycleZoned.d.ts +10 -7
- package/dist/zoned/calculate/cycleZoned.js +19 -11
- package/dist/zoned/calculate/diffZoned.d.ts +39 -17
- package/dist/zoned/calculate/diffZoned.js +90 -45
- package/dist/zoned/calculate/diffZonedAsDuration.d.ts +19 -9
- package/dist/zoned/calculate/diffZonedAsDuration.js +32 -15
- package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +11 -11
- package/dist/zoned/calculate/endOfQuarterForZoned.js +32 -31
- package/dist/zoned/calculate/endOfZoned.d.ts +21 -14
- package/dist/zoned/calculate/endOfZoned.js +25 -111
- package/dist/zoned/calculate/getHoursInZonedDay.d.ts +8 -1
- package/dist/zoned/calculate/getHoursInZonedDay.js +10 -14
- package/dist/zoned/calculate/getLocaleZonedDayOfWeek.d.ts +8 -4
- package/dist/zoned/calculate/getLocaleZonedDayOfWeek.js +9 -6
- package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +20 -26
- package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +40 -44
- package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +16 -24
- package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +36 -42
- package/dist/zoned/calculate/getQuarterForZoned.js +2 -2
- package/dist/zoned/calculate/maxZoned.js +20 -12
- package/dist/zoned/calculate/minZoned.d.ts +1 -1
- package/dist/zoned/calculate/minZoned.js +21 -13
- package/dist/zoned/calculate/roundZoned.d.ts +18 -4
- package/dist/zoned/calculate/roundZoned.js +58 -33
- package/dist/zoned/calculate/setZoned.d.ts +9 -3
- package/dist/zoned/calculate/setZoned.js +39 -18
- package/dist/zoned/calculate/sortZoned.js +18 -10
- package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +4 -7
- package/dist/zoned/calculate/startOfQuarterForZoned.js +23 -17
- package/dist/zoned/calculate/startOfZoned.d.ts +17 -13
- package/dist/zoned/calculate/startOfZoned.js +21 -103
- package/dist/zoned/calculate/subtractZoned.d.ts +36 -24
- package/dist/zoned/calculate/subtractZoned.js +66 -50
- package/dist/zoned/calculate/subtractZonedBusinessDays.d.ts +2 -0
- package/dist/zoned/calculate/subtractZonedBusinessDays.js +5 -2
- package/dist/zoned/chop/chopZonedDate.js +2 -2
- package/dist/zoned/chop/chopZonedDateTime.js +2 -2
- package/dist/zoned/chop/chopZonedMilliseconds.js +2 -2
- package/dist/zoned/chop/chopZonedSeconds.js +2 -2
- package/dist/zoned/chop/chopZonedTime.js +2 -2
- package/dist/zoned/chop/chopZonedTimezone.js +2 -2
- package/dist/zoned/compare/areZonedEqual.js +3 -2
- package/dist/zoned/compare/areZonedEqualBy.d.ts +15 -2
- package/dist/zoned/compare/areZonedEqualBy.js +45 -12
- package/dist/zoned/compare/isAfterZoned.js +3 -2
- package/dist/zoned/compare/isBeforeZoned.d.ts +1 -1
- package/dist/zoned/compare/isBeforeZoned.js +4 -3
- package/dist/zoned/compare/isBetweenZoned.js +46 -29
- package/dist/zoned/compare/isInDaylightSaving.js +4 -4
- package/dist/zoned/compare/isZonedBusinessDay.d.ts +7 -4
- package/dist/zoned/compare/isZonedBusinessDay.js +9 -6
- package/dist/zoned/compare/isZonedFuture.js +2 -1
- package/dist/zoned/compare/isZonedPast.js +2 -1
- package/dist/zoned/compare/isZonedRelativeDay.js +2 -1
- package/dist/zoned/compare/isZonedThisUnit.d.ts +12 -4
- package/dist/zoned/compare/isZonedThisUnit.js +37 -16
- package/dist/zoned/compare/isZonedWeekend.d.ts +8 -4
- package/dist/zoned/compare/isZonedWeekend.js +9 -6
- package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +10 -5
- package/dist/zoned/convert/convertPlainDateTimeToZoned.js +34 -16
- package/dist/zoned/convert/convertZonedToCalendar.d.ts +26 -38
- package/dist/zoned/convert/convertZonedToCalendar.js +33 -48
- package/dist/zoned/convert/convertZonedToPlainDateTime.d.ts +6 -0
- package/dist/zoned/convert/convertZonedToPlainDateTime.js +8 -2
- package/dist/zoned/convert/convertZonedToUnix.d.ts +12 -6
- package/dist/zoned/convert/convertZonedToUnix.js +23 -16
- package/dist/zoned/convert/convertZonedToUtc.js +2 -2
- package/dist/zoned/convert/convertZonedToZoned.js +2 -2
- package/dist/zoned/format/formatCalendarZoned.d.ts +7 -3
- package/dist/zoned/format/formatCalendarZoned.js +37 -39
- package/dist/zoned/format/formatRelativeZoned.d.ts +15 -6
- package/dist/zoned/format/formatRelativeZoned.js +54 -54
- package/dist/zoned/format/formatRfc2822.d.ts +14 -1
- package/dist/zoned/format/formatRfc2822.js +27 -13
- package/dist/zoned/format/formatRfc3339.d.ts +14 -1
- package/dist/zoned/format/formatRfc3339.js +29 -3
- package/dist/zoned/format/formatTimeZoneName.d.ts +3 -2
- package/dist/zoned/format/formatTimeZoneName.js +28 -18
- package/dist/zoned/format/formatZonedDateTime.d.ts +25 -5
- package/dist/zoned/format/formatZonedDateTime.js +40 -9
- package/dist/zoned/format/formatZonedRange.d.ts +24 -6
- package/dist/zoned/format/formatZonedRange.js +61 -28
- package/dist/zoned/format/formatZonedToParts.d.ts +29 -6
- package/dist/zoned/format/formatZonedToParts.js +42 -13
- package/dist/zoned/get/getDstTransitions.d.ts +6 -1
- package/dist/zoned/get/getDstTransitions.js +17 -15
- package/dist/zoned/get/getTimeZoneOffset.d.ts +11 -1
- package/dist/zoned/get/getTimeZoneOffset.js +19 -2
- package/dist/zoned/get/getZonedNow.js +20 -9
- package/dist/zoned/get/getZonedNowUnit.d.ts +8 -4
- package/dist/zoned/get/getZonedNowUnit.js +15 -31
- package/dist/zoned/index.js +1 -1
- package/dist/zoned/interval/intervalAbutsZoned.d.ts +18 -11
- package/dist/zoned/interval/intervalAbutsZoned.js +24 -25
- package/dist/zoned/interval/intervalContainsZoned.d.ts +16 -7
- package/dist/zoned/interval/intervalContainsZoned.js +22 -14
- package/dist/zoned/interval/intervalCountZoned.d.ts +19 -11
- package/dist/zoned/interval/intervalCountZoned.js +32 -27
- package/dist/zoned/interval/intervalDifferenceZoned.d.ts +13 -7
- package/dist/zoned/interval/intervalDifferenceZoned.js +24 -36
- package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +18 -9
- package/dist/zoned/interval/intervalDivideEquallyZoned.js +67 -46
- package/dist/zoned/interval/intervalEngulfsZoned.d.ts +10 -5
- package/dist/zoned/interval/intervalEngulfsZoned.js +16 -10
- package/dist/zoned/interval/intervalFromDurationZoned.d.ts +25 -11
- package/dist/zoned/interval/intervalFromDurationZoned.js +61 -44
- package/dist/zoned/interval/intervalIntersectionZoned.d.ts +12 -6
- package/dist/zoned/interval/intervalIntersectionZoned.js +24 -18
- package/dist/zoned/interval/intervalLengthZoned.d.ts +15 -6
- package/dist/zoned/interval/intervalLengthZoned.js +23 -9
- package/dist/zoned/interval/intervalOverlappingDaysZoned.d.ts +28 -17
- package/dist/zoned/interval/intervalOverlappingDaysZoned.js +46 -34
- package/dist/zoned/interval/intervalSplitAtZoned.d.ts +6 -3
- package/dist/zoned/interval/intervalSplitAtZoned.js +52 -42
- package/dist/zoned/interval/intervalUnionZoned.d.ts +14 -8
- package/dist/zoned/interval/intervalUnionZoned.js +25 -20
- package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -7
- package/dist/zoned/interval/intervalXorAllZoned.js +42 -73
- package/dist/zoned/interval/intervalXorZoned.d.ts +20 -12
- package/dist/zoned/interval/intervalXorZoned.js +34 -64
- package/dist/zoned/interval/intervalsOverlapZoned.d.ts +15 -7
- package/dist/zoned/interval/intervalsOverlapZoned.js +21 -12
- package/dist/zoned/interval/mergeIntervalsZoned.d.ts +10 -3
- package/dist/zoned/interval/mergeIntervalsZoned.js +44 -41
- package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +28 -5
- package/dist/zoned/interval/splitIntervalByUnitZoned.js +72 -39
- package/dist/zoned/interval/validate/isValidCalendarZonedInterval.d.ts +13 -10
- package/dist/zoned/interval/validate/isValidCalendarZonedInterval.js +13 -10
- package/dist/zoned/interval/validate/isValidZonedInterval.d.ts +7 -5
- package/dist/zoned/interval/validate/isValidZonedInterval.js +12 -16
- package/dist/zoned/map/mapZonedDatesInRange.d.ts +17 -1
- package/dist/zoned/map/mapZonedDatesInRange.js +62 -26
- package/dist/zoned/map/mapZonedHoursInDay.d.ts +10 -13
- package/dist/zoned/map/mapZonedHoursInDay.js +13 -21
- package/dist/zoned/parse/getZonedOffset.js +2 -2
- package/dist/zoned/parse/getZonedOffsetAs.d.ts +4 -2
- package/dist/zoned/parse/getZonedOffsetAs.js +10 -5
- package/dist/zoned/parse/parseDateFromZoned.js +2 -2
- package/dist/zoned/parse/parseDateTimeFromZoned.js +2 -2
- package/dist/zoned/parse/parseDayFromZoned.js +2 -2
- package/dist/zoned/parse/parseDayOfWeekFromZoned.js +2 -2
- package/dist/zoned/parse/parseHourFromZoned.js +2 -2
- package/dist/zoned/parse/parseMicrosecondFromZoned.d.ts +2 -1
- package/dist/zoned/parse/parseMicrosecondFromZoned.js +4 -3
- package/dist/zoned/parse/parseMillisecondFromZoned.js +2 -2
- package/dist/zoned/parse/parseMinuteFromZoned.js +2 -2
- package/dist/zoned/parse/parseMonthFromZoned.js +2 -2
- package/dist/zoned/parse/parseNanosecondFromZoned.d.ts +2 -1
- package/dist/zoned/parse/parseNanosecondFromZoned.js +4 -3
- package/dist/zoned/parse/parseRfc2822.d.ts +32 -12
- package/dist/zoned/parse/parseRfc2822.js +47 -45
- package/dist/zoned/parse/parseRfc3339.d.ts +6 -0
- package/dist/zoned/parse/parseRfc3339.js +6 -0
- package/dist/zoned/parse/parseSecondFromZoned.js +2 -2
- package/dist/zoned/parse/parseTimeFromZoned.js +2 -2
- package/dist/zoned/parse/parseTimeZoneFromZoned.js +2 -2
- package/dist/zoned/parse/parseUnitFromZoned.d.ts +14 -5
- package/dist/zoned/parse/parseUnitFromZoned.js +59 -33
- package/dist/zoned/parse/parseWeekFromZoned.d.ts +13 -3
- package/dist/zoned/parse/parseWeekFromZoned.js +34 -10
- package/dist/zoned/parse/parseYearFromZoned.js +2 -2
- package/dist/zoned/validate/hasDaylightSaving.js +3 -3
- package/dist/zoned/validate/isValidCalendarZonedDateTime.d.ts +31 -16
- package/dist/zoned/validate/isValidCalendarZonedDateTime.js +31 -16
- package/dist/zoned/validate/isValidTimeZone.d.ts +15 -2
- package/dist/zoned/validate/isValidTimeZone.js +17 -4
- package/dist/zoned/validate/isValidZonedDateTime.d.ts +14 -7
- package/dist/zoned/validate/isValidZonedDateTime.js +20 -12
- package/dist/zoned/validate/isValidZonedRange.d.ts +9 -2
- package/dist/zoned/validate/isValidZonedRange.js +44 -16
- package/package.json +510 -34
- package/skills/gmt-arithmetic/SKILL.md +197 -16
- package/skills/gmt-basics/SKILL.md +61 -14
- package/skills/gmt-integration/SKILL.md +54 -8
- package/skills/gmt-timezone/SKILL.md +208 -24
- package/dist/internal/advanceBusinessDays.d.ts +0 -2
- package/dist/internal/advanceBusinessDays.js +0 -15
- package/dist/internal/ethiopicFamilyCalendar.d.ts +0 -47
- package/dist/internal/ethiopicFamilyCalendar.js +0 -136
- package/dist/internal/getLocaleMinimalDaysInFirstWeek.d.ts +0 -20
- package/dist/internal/getLocaleMinimalDaysInFirstWeek.js +0 -31
- package/dist/internal/resolveUnixTimeZone.d.ts +0 -20
- package/dist/internal/resolveUnixTimeZone.js +0 -30
- package/dist/unix/calculate/startOrEndOfUnix.d.ts +0 -27
- package/dist/unix/calculate/startOrEndOfUnix.js +0 -140
- package/dist/unix/interval/resolveUnixIntervalPair.d.ts +0 -7
- package/dist/unix/interval/resolveUnixIntervalPair.js +0 -36
|
@@ -0,0 +1,1174 @@
|
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { TIME_ZONE_ANNOTATION } from "./isoStringBody.js";
|
|
3
|
+
import { MAX_EPOCH_NANOSECONDS, MIN_EPOCH_NANOSECONDS, } from "./epochNanoseconds.js";
|
|
4
|
+
import { calendarDateAdd as compatCalendarDateAdd, calendarDateUntil as compatCalendarDateUntil, isCalendarArithmeticCompatNeeded, isNudgeWindowCompatNeeded, } from "./temporalCompat/index.js";
|
|
5
|
+
import { epochNanosecondsFor, isNamedTimeZone, isValidEpoch, utcEpochNanoseconds, zonedDateTimeFrom, } from "./zonedWallClock.js";
|
|
6
|
+
const UNITS = [
|
|
7
|
+
"year",
|
|
8
|
+
"month",
|
|
9
|
+
"week",
|
|
10
|
+
"day",
|
|
11
|
+
"hour",
|
|
12
|
+
"minute",
|
|
13
|
+
"second",
|
|
14
|
+
"millisecond",
|
|
15
|
+
"microsecond",
|
|
16
|
+
"nanosecond",
|
|
17
|
+
];
|
|
18
|
+
const NANOSECONDS_PER_HOUR = 3600000000000n;
|
|
19
|
+
const NANOSECONDS_PER_DAY = 24n * NANOSECONDS_PER_HOUR;
|
|
20
|
+
/** TC39 Table "Temporal units by descending magnitude", "Length in Nanoseconds" column. */
|
|
21
|
+
const NANOSECONDS_PER_TIME_UNIT = {
|
|
22
|
+
hour: NANOSECONDS_PER_HOUR,
|
|
23
|
+
minute: 60000000000n,
|
|
24
|
+
second: 1000000000n,
|
|
25
|
+
millisecond: 1000000n,
|
|
26
|
+
microsecond: 1000n,
|
|
27
|
+
nanosecond: 1n,
|
|
28
|
+
};
|
|
29
|
+
/** Upper bound on one unit's exact length in any zone: 366-day years, 31-day months, 2-day days. */
|
|
30
|
+
const UNIT_REACH = {
|
|
31
|
+
year: 366n * NANOSECONDS_PER_DAY,
|
|
32
|
+
month: 31n * NANOSECONDS_PER_DAY,
|
|
33
|
+
week: 7n * NANOSECONDS_PER_DAY,
|
|
34
|
+
day: 2n * NANOSECONDS_PER_DAY,
|
|
35
|
+
...NANOSECONDS_PER_TIME_UNIT,
|
|
36
|
+
};
|
|
37
|
+
/** A wall clock lies within a day of its exact time, and the offset probes look one day further. */
|
|
38
|
+
const LIMIT_MARGIN = 2n * NANOSECONDS_PER_DAY;
|
|
39
|
+
/** TC39 `maxTimeDuration`: 2^53 × 10^9 − 1 nanoseconds. */
|
|
40
|
+
const MAX_TIME_DURATION = 2n ** 53n * 1000000000n - 1n;
|
|
41
|
+
/** The zone that resolves exactly like `"UTC"` in the spec but through the validating branch. */
|
|
42
|
+
const UTC_EQUIVALENT_OFFSET_ZONE = "+00:00";
|
|
43
|
+
/** Validates Temporal options exactly as the wrapped method does, far from any limit. */
|
|
44
|
+
const OPTIONS_PROBE = new Temporal.ZonedDateTime(0n, "UTC");
|
|
45
|
+
const ZERO_DURATION = new Temporal.Duration();
|
|
46
|
+
/** An RFC 9557 time zone annotation (`[Europe/London]`, `[!+01:00]`), never a `key=value` one. */
|
|
47
|
+
const timeZoneAnnotation = new RegExp(TIME_ZONE_ANNOTATION);
|
|
48
|
+
const ZERO_DATE_DURATION = {
|
|
49
|
+
years: 0,
|
|
50
|
+
months: 0,
|
|
51
|
+
weeks: 0,
|
|
52
|
+
days: 0,
|
|
53
|
+
};
|
|
54
|
+
// ---------------------------------------------------------------------------------------------
|
|
55
|
+
// Units, signs and rounding
|
|
56
|
+
// ---------------------------------------------------------------------------------------------
|
|
57
|
+
/** A Temporal unit name, singular or plural, or null when it is not one. */
|
|
58
|
+
function toUnit(value) {
|
|
59
|
+
if (typeof value !== "string")
|
|
60
|
+
return null;
|
|
61
|
+
const singular = value.endsWith("s") ? value.slice(0, -1) : value;
|
|
62
|
+
return UNITS.find((unit) => unit === singular) ?? null;
|
|
63
|
+
}
|
|
64
|
+
/** TC39 `TemporalUnitCategory(unit)` is ~date~. */
|
|
65
|
+
function isDateUnit(unit) {
|
|
66
|
+
return UNITS.indexOf(unit) <= UNITS.indexOf("day");
|
|
67
|
+
}
|
|
68
|
+
/** TC39 `LargerOfTwoTemporalUnits`. */
|
|
69
|
+
function largerUnit(one, two) {
|
|
70
|
+
return UNITS.indexOf(one) <= UNITS.indexOf(two) ? one : two;
|
|
71
|
+
}
|
|
72
|
+
function bigintSign(value) {
|
|
73
|
+
if (value < 0n)
|
|
74
|
+
return -1;
|
|
75
|
+
return value > 0n ? 1 : 0;
|
|
76
|
+
}
|
|
77
|
+
function bigintAbs(value) {
|
|
78
|
+
return value < 0n ? -value : value;
|
|
79
|
+
}
|
|
80
|
+
/** TC39 `DateDurationSign`. */
|
|
81
|
+
function dateDurationSign(duration) {
|
|
82
|
+
for (const value of [
|
|
83
|
+
duration.years,
|
|
84
|
+
duration.months,
|
|
85
|
+
duration.weeks,
|
|
86
|
+
duration.days,
|
|
87
|
+
]) {
|
|
88
|
+
if (value !== 0)
|
|
89
|
+
return value < 0 ? -1 : 1;
|
|
90
|
+
}
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
/** TC39 `InternalDurationSign`. */
|
|
94
|
+
function internalDurationSign(duration) {
|
|
95
|
+
return dateDurationSign(duration.date) || bigintSign(duration.time);
|
|
96
|
+
}
|
|
97
|
+
/** TC39 `AdjustDateDurationRecord`. */
|
|
98
|
+
function adjustDateDuration(duration, days, weeks = duration.weeks, months = duration.months) {
|
|
99
|
+
return { years: duration.years, months, weeks, days };
|
|
100
|
+
}
|
|
101
|
+
/** TC39 `ToInternalDurationRecord`. */
|
|
102
|
+
function toInternalDuration(duration) {
|
|
103
|
+
const { years, months, weeks, days } = duration;
|
|
104
|
+
return {
|
|
105
|
+
date: { years, months, weeks, days },
|
|
106
|
+
time: BigInt(duration.hours) * NANOSECONDS_PER_TIME_UNIT.hour +
|
|
107
|
+
BigInt(duration.minutes) * NANOSECONDS_PER_TIME_UNIT.minute +
|
|
108
|
+
BigInt(duration.seconds) * NANOSECONDS_PER_TIME_UNIT.second +
|
|
109
|
+
BigInt(duration.milliseconds) * NANOSECONDS_PER_TIME_UNIT.millisecond +
|
|
110
|
+
BigInt(duration.microseconds) * NANOSECONDS_PER_TIME_UNIT.microsecond +
|
|
111
|
+
BigInt(duration.nanoseconds),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** TC39 `DefaultTemporalLargestUnit`. */
|
|
115
|
+
function defaultLargestUnit(duration) {
|
|
116
|
+
return (UNITS.find((unit) => duration[`${unit}s`] !== 0) ?? "nanosecond");
|
|
117
|
+
}
|
|
118
|
+
/** TC39 `GetUnsignedRoundingMode`, as [positive, negative]. */
|
|
119
|
+
const UNSIGNED_ROUNDING_MODES = {
|
|
120
|
+
ceil: ["infinity", "zero"],
|
|
121
|
+
floor: ["zero", "infinity"],
|
|
122
|
+
expand: ["infinity", "infinity"],
|
|
123
|
+
trunc: ["zero", "zero"],
|
|
124
|
+
halfCeil: ["half-infinity", "half-zero"],
|
|
125
|
+
halfFloor: ["half-zero", "half-infinity"],
|
|
126
|
+
halfExpand: ["half-infinity", "half-infinity"],
|
|
127
|
+
halfTrunc: ["half-zero", "half-zero"],
|
|
128
|
+
halfEven: ["half-even", "half-even"],
|
|
129
|
+
};
|
|
130
|
+
function unsignedRoundingMode(roundingMode, sign) {
|
|
131
|
+
return UNSIGNED_ROUNDING_MODES[roundingMode][sign < 0 ? 1 : 0];
|
|
132
|
+
}
|
|
133
|
+
/** TC39 `ApplyUnsignedRoundingMode`, given the sign of (2 × remainder − increment) as `cmp`. */
|
|
134
|
+
function applyUnsignedRoundingMode(r1, r2, cmp, even, mode) {
|
|
135
|
+
if (mode === "zero")
|
|
136
|
+
return r1;
|
|
137
|
+
if (mode === "infinity")
|
|
138
|
+
return r2;
|
|
139
|
+
if (cmp !== 0)
|
|
140
|
+
return cmp < 0 ? r1 : r2;
|
|
141
|
+
if (mode === "half-zero")
|
|
142
|
+
return r1;
|
|
143
|
+
if (mode === "half-infinity")
|
|
144
|
+
return r2;
|
|
145
|
+
return even ? r1 : r2;
|
|
146
|
+
}
|
|
147
|
+
/** TC39 `RoundTimeDurationToIncrement`. */
|
|
148
|
+
function roundTimeDurationToIncrement(duration, increment, roundingMode) {
|
|
149
|
+
const quotient = bigintAbs(duration / increment);
|
|
150
|
+
const remainder = duration % increment;
|
|
151
|
+
const r1 = quotient * increment;
|
|
152
|
+
const rounded = remainder === 0n
|
|
153
|
+
? r1
|
|
154
|
+
: applyUnsignedRoundingMode(r1, r1 + increment, bigintSign(bigintAbs(remainder * 2n) - increment), quotient % 2n === 0n, unsignedRoundingMode(roundingMode, bigintSign(duration)));
|
|
155
|
+
const result = duration < 0n ? -rounded : rounded;
|
|
156
|
+
if (bigintAbs(result) > MAX_TIME_DURATION) {
|
|
157
|
+
throw new RangeError("The rounded time duration is out of range");
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* The float64 value of `numerator / denominator`, as the polyfill's `TimeDuration#fdiv` computes
|
|
163
|
+
* TC39's exact division: the integer quotient plus 50 long-division decimal digits.
|
|
164
|
+
*/
|
|
165
|
+
function divideToNumber(numerator, denominator) {
|
|
166
|
+
const divisor = bigintAbs(denominator);
|
|
167
|
+
let remainder = bigintAbs(numerator % denominator);
|
|
168
|
+
const digits = [];
|
|
169
|
+
while (remainder !== 0n && digits.length < 50) {
|
|
170
|
+
remainder *= 10n;
|
|
171
|
+
digits.push(String(remainder / divisor));
|
|
172
|
+
remainder %= divisor;
|
|
173
|
+
}
|
|
174
|
+
const magnitude = Number(`${bigintAbs(numerator / denominator)}.${digits.join("")}`);
|
|
175
|
+
return bigintSign(numerator) * bigintSign(denominator) < 0
|
|
176
|
+
? -magnitude
|
|
177
|
+
: magnitude;
|
|
178
|
+
}
|
|
179
|
+
// ---------------------------------------------------------------------------------------------
|
|
180
|
+
// Date-time steps, from polyfill operations that are correct at the limits
|
|
181
|
+
// ---------------------------------------------------------------------------------------------
|
|
182
|
+
/** TC39 `GetISODateTimeFor`. */
|
|
183
|
+
function isoDateTimeFor(timeZone, epochNs) {
|
|
184
|
+
return new Temporal.ZonedDateTime(epochNs, timeZone).toPlainDateTime();
|
|
185
|
+
}
|
|
186
|
+
/** TC39 `GetEpochNanosecondsFor(timeZone, isoDateTime, ~compatible~)` for a named zone. */
|
|
187
|
+
function epochFor(timeZone, wall) {
|
|
188
|
+
return epochNanosecondsFor(timeZone, wall, "compatible");
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* TC39 `CombineISODateAndTimeRecord`. A combination outside the PlainDateTime limits throws here;
|
|
192
|
+
* the spec throws for it at the `GetEpochNanosecondsFor` that always follows.
|
|
193
|
+
*/
|
|
194
|
+
function atTimeOf(date, wall) {
|
|
195
|
+
return date.toPlainDateTime(wall.toPlainTime());
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* TC39 `CalendarDateAdd(calendar, isoDate, duration, ~constrain~)`, through the Temporal compat
|
|
199
|
+
* layer (the polyfill's own `add` for `iso8601`).
|
|
200
|
+
*/
|
|
201
|
+
function calendarDateAdd(calendar, isoDate, duration) {
|
|
202
|
+
return compatCalendarDateAdd(isoDate.withCalendar(calendar), duration, "constrain").withCalendar("iso8601");
|
|
203
|
+
}
|
|
204
|
+
/** TC39 `CalendarDateUntil`, through the Temporal compat layer. */
|
|
205
|
+
function calendarDateUntil(calendar, one, two, largestUnit) {
|
|
206
|
+
return compatCalendarDateUntil(one.withCalendar(calendar), two.withCalendar(calendar), largestUnit);
|
|
207
|
+
}
|
|
208
|
+
/** TC39 `AddInstant`. */
|
|
209
|
+
function addInstant(epochNs, time) {
|
|
210
|
+
const result = epochNs + time;
|
|
211
|
+
if (!isValidEpoch(result)) {
|
|
212
|
+
throw new RangeError("The result is outside the supported range");
|
|
213
|
+
}
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
/** TC39 `AddZonedDateTime(…, ~constrain~)`. */
|
|
217
|
+
function addZonedDateTime(zoned, duration) {
|
|
218
|
+
if (dateDurationSign(duration.date) === 0) {
|
|
219
|
+
return addInstant(zoned.epochNanoseconds, duration.time);
|
|
220
|
+
}
|
|
221
|
+
const wall = isoDateTimeFor(zoned.timeZoneId, zoned.epochNanoseconds);
|
|
222
|
+
const addedDate = calendarDateAdd(zoned.calendarId, wall.toPlainDate(), duration.date);
|
|
223
|
+
return addInstant(epochFor(zoned.timeZoneId, atTimeOf(addedDate, wall)), duration.time);
|
|
224
|
+
}
|
|
225
|
+
/** TC39 `TemporalDurationFromInternal` for a time `largestUnit`, balanced by `Instant#until`. */
|
|
226
|
+
function temporalDurationFromInternal(duration, largestUnit) {
|
|
227
|
+
const base = duration.time < 0n ? MAX_EPOCH_NANOSECONDS : MIN_EPOCH_NANOSECONDS;
|
|
228
|
+
const time = new Temporal.Instant(base).until(new Temporal.Instant(base + duration.time), { largestUnit });
|
|
229
|
+
const { years, months, weeks, days } = duration.date;
|
|
230
|
+
return new Temporal.Duration(years, months, weeks, days, time.hours, time.minutes, time.seconds, time.milliseconds, time.microseconds, time.nanoseconds);
|
|
231
|
+
}
|
|
232
|
+
// ---------------------------------------------------------------------------------------------
|
|
233
|
+
// Difference and rounding abstract operations
|
|
234
|
+
// ---------------------------------------------------------------------------------------------
|
|
235
|
+
/** TC39 `DifferenceZonedDateTime`. */
|
|
236
|
+
function differenceZonedDateTime(ns1, ns2, context, largestUnit) {
|
|
237
|
+
if (ns1 === ns2)
|
|
238
|
+
return { date: ZERO_DATE_DURATION, time: 0n };
|
|
239
|
+
const start = isoDateTimeFor(context.timeZone, ns1);
|
|
240
|
+
const end = isoDateTimeFor(context.timeZone, ns2);
|
|
241
|
+
const startDate = start.toPlainDate();
|
|
242
|
+
const endDate = end.toPlainDate();
|
|
243
|
+
if (Temporal.PlainDate.compare(startDate, endDate) === 0) {
|
|
244
|
+
return { date: ZERO_DATE_DURATION, time: ns2 - ns1 };
|
|
245
|
+
}
|
|
246
|
+
const sign = ns2 - ns1 < 0n ? 1 : -1;
|
|
247
|
+
const maxDayCorrection = sign === -1 ? 2 : 1;
|
|
248
|
+
// TimeDurationSign(DifferenceTime(start time, end time)) = sign
|
|
249
|
+
let dayCorrection = Temporal.PlainTime.compare(end.toPlainTime(), start.toPlainTime()) === sign
|
|
250
|
+
? 1
|
|
251
|
+
: 0;
|
|
252
|
+
for (; dayCorrection <= maxDayCorrection; dayCorrection++) {
|
|
253
|
+
const intermediate = atTimeOf(endDate.add({ days: dayCorrection * sign }), start);
|
|
254
|
+
const time = ns2 - epochFor(context.timeZone, intermediate);
|
|
255
|
+
if (bigintSign(time) !== sign) {
|
|
256
|
+
return {
|
|
257
|
+
date: calendarDateUntil(context.calendar, startDate, intermediate.toPlainDate(), largerUnit(largestUnit, "day")),
|
|
258
|
+
time,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
throw new RangeError("More than the maximum day correction was needed");
|
|
263
|
+
}
|
|
264
|
+
function truncateToIncrement(value, increment) {
|
|
265
|
+
return Math.trunc(value / increment) * increment;
|
|
266
|
+
}
|
|
267
|
+
/** The [[R1]]/[[R2]] bounds and their date durations, from TC39 `ComputeNudgeWindow` steps 1–4. */
|
|
268
|
+
function nudgeWindowBounds(sign, date, context, increment, unit, additionalShift) {
|
|
269
|
+
const shift = additionalShift ? increment * sign : 0;
|
|
270
|
+
if (unit === "year") {
|
|
271
|
+
const r1 = truncateToIncrement(date.years, increment) + shift;
|
|
272
|
+
const r2 = r1 + increment * sign;
|
|
273
|
+
return {
|
|
274
|
+
r1,
|
|
275
|
+
r2,
|
|
276
|
+
startDuration: { ...ZERO_DATE_DURATION, years: r1 },
|
|
277
|
+
endDuration: { ...ZERO_DATE_DURATION, years: r2 },
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
if (unit === "month") {
|
|
281
|
+
const r1 = truncateToIncrement(date.months, increment) + shift;
|
|
282
|
+
const r2 = r1 + increment * sign;
|
|
283
|
+
return {
|
|
284
|
+
r1,
|
|
285
|
+
r2,
|
|
286
|
+
startDuration: adjustDateDuration(date, 0, 0, r1),
|
|
287
|
+
endDuration: adjustDateDuration(date, 0, 0, r2),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
if (unit === "week") {
|
|
291
|
+
const weeksStart = calendarDateAdd(context.calendar, context.wall.toPlainDate(), adjustDateDuration(date, 0, 0));
|
|
292
|
+
const weeksEnd = weeksStart.add({ days: date.days });
|
|
293
|
+
const untilResult = calendarDateUntil(context.calendar, weeksStart, weeksEnd, "week");
|
|
294
|
+
const r1 = truncateToIncrement(date.weeks + untilResult.weeks, increment);
|
|
295
|
+
const r2 = r1 + increment * sign;
|
|
296
|
+
return {
|
|
297
|
+
r1,
|
|
298
|
+
r2,
|
|
299
|
+
startDuration: adjustDateDuration(date, 0, r1),
|
|
300
|
+
endDuration: adjustDateDuration(date, 0, r2),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
const r1 = truncateToIncrement(date.days, increment);
|
|
304
|
+
const r2 = r1 + increment * sign;
|
|
305
|
+
return {
|
|
306
|
+
r1,
|
|
307
|
+
r2,
|
|
308
|
+
startDuration: adjustDateDuration(date, r1),
|
|
309
|
+
endDuration: adjustDateDuration(date, r2),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/** The exact time `duration` after the origin wall clock, resolved in the zone. */
|
|
313
|
+
function windowBoundEpoch(context, duration) {
|
|
314
|
+
const date = calendarDateAdd(context.calendar, context.wall.toPlainDate(), duration);
|
|
315
|
+
return contextEpoch(context, atTimeOf(date, context.wall));
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* The exact time of `wall` in `context`: TC39 `GetEpochNanosecondsFor(timeZone, wall, ~compatible~)`,
|
|
319
|
+
* or `GetUTCEpochNanoseconds(wall)` when the time zone is unset (a plain context).
|
|
320
|
+
*/
|
|
321
|
+
function contextEpoch(context, wall) {
|
|
322
|
+
return context.timeZone === undefined
|
|
323
|
+
? utcEpochNanoseconds(wall)
|
|
324
|
+
: epochFor(context.timeZone, wall);
|
|
325
|
+
}
|
|
326
|
+
/** TC39 `ComputeNudgeWindow`. */
|
|
327
|
+
function computeNudgeWindow(sign, duration, originEpochNs, context, increment, unit, additionalShift) {
|
|
328
|
+
const bounds = nudgeWindowBounds(sign, duration.date, context, increment, unit, additionalShift);
|
|
329
|
+
// A start bound that adds nothing is the origin itself, never a re-resolved wall clock.
|
|
330
|
+
const startEpochNs = dateDurationSign(bounds.startDuration) === 0
|
|
331
|
+
? originEpochNs
|
|
332
|
+
: windowBoundEpoch(context, bounds.startDuration);
|
|
333
|
+
return {
|
|
334
|
+
...bounds,
|
|
335
|
+
startEpochNs,
|
|
336
|
+
endEpochNs: windowBoundEpoch(context, bounds.endDuration),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
function windowContains(sign, window, destEpochNs) {
|
|
340
|
+
const [low, high] = sign === 1
|
|
341
|
+
? [window.startEpochNs, window.endEpochNs]
|
|
342
|
+
: [window.endEpochNs, window.startEpochNs];
|
|
343
|
+
return low <= destEpochNs && destEpochNs <= high;
|
|
344
|
+
}
|
|
345
|
+
/** TC39 `NudgeToCalendarUnit`; `total` is its [[Total]]. */
|
|
346
|
+
function nudgeToCalendarUnit(sign, duration, originEpochNs, destEpochNs, context, increment, unit, roundingMode) {
|
|
347
|
+
let window = computeNudgeWindow(sign, duration, originEpochNs, context, increment, unit, false);
|
|
348
|
+
let didExpandCalendarUnit = false;
|
|
349
|
+
if (!windowContains(sign, window, destEpochNs)) {
|
|
350
|
+
window = computeNudgeWindow(sign, duration, originEpochNs, context, increment, unit, true);
|
|
351
|
+
didExpandCalendarUnit = true;
|
|
352
|
+
}
|
|
353
|
+
const { r1, r2, startEpochNs, endEpochNs } = window;
|
|
354
|
+
const progress = destEpochNs - startEpochNs;
|
|
355
|
+
const span = endEpochNs - startEpochNs;
|
|
356
|
+
const total = divideToNumber(span * BigInt(r1) + progress * BigInt(sign), span);
|
|
357
|
+
let roundedUnit;
|
|
358
|
+
if (progress === 0n) {
|
|
359
|
+
// The target is the lower bound itself, so it is already rounded. TC39 leaves this to
|
|
360
|
+
// ApplyUnsignedRoundingMode's "if x is equal to r1, return r1" step, which this
|
|
361
|
+
// comparison-based form cannot see: without the branch, `ceil` (unsigned mode "infinity")
|
|
362
|
+
// would expand an exact boundary to the next whole unit.
|
|
363
|
+
roundedUnit = Math.abs(r1);
|
|
364
|
+
}
|
|
365
|
+
else if (progress === span) {
|
|
366
|
+
roundedUnit = Math.abs(r2);
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
roundedUnit = applyUnsignedRoundingMode(Math.abs(r1), Math.abs(r2), bigintSign(bigintAbs(progress * 2n) - bigintAbs(span)), (Math.abs(r1) / increment) % 2 === 0, unsignedRoundingMode(roundingMode, sign));
|
|
370
|
+
}
|
|
371
|
+
const expanded = roundedUnit === Math.abs(r2);
|
|
372
|
+
return {
|
|
373
|
+
nudgeResult: {
|
|
374
|
+
duration: {
|
|
375
|
+
date: expanded ? window.endDuration : window.startDuration,
|
|
376
|
+
time: 0n,
|
|
377
|
+
},
|
|
378
|
+
nudgedEpochNs: expanded ? endEpochNs : startEpochNs,
|
|
379
|
+
didExpandCalendarUnit: didExpandCalendarUnit || expanded,
|
|
380
|
+
},
|
|
381
|
+
total,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
/** TC39 `NudgeToZonedTime`. */
|
|
385
|
+
function nudgeToZonedTime(sign, duration, context, increment, unit, roundingMode) {
|
|
386
|
+
const start = calendarDateAdd(context.calendar, context.wall.toPlainDate(), duration.date);
|
|
387
|
+
const startEpochNs = epochFor(context.timeZone, atTimeOf(start, context.wall));
|
|
388
|
+
const endEpochNs = epochFor(context.timeZone, atTimeOf(start.add({ days: sign }), context.wall));
|
|
389
|
+
const daySpan = endEpochNs - startEpochNs;
|
|
390
|
+
if (bigintSign(daySpan) !== sign) {
|
|
391
|
+
throw new RangeError("The time zone returned inconsistent instants");
|
|
392
|
+
}
|
|
393
|
+
const unitIncrement = BigInt(increment) * NANOSECONDS_PER_TIME_UNIT[unit];
|
|
394
|
+
let roundedTime = roundTimeDurationToIncrement(duration.time, unitIncrement, roundingMode);
|
|
395
|
+
const beyondDaySpan = roundedTime - daySpan;
|
|
396
|
+
const didRoundBeyondDay = bigintSign(beyondDaySpan) !== -sign;
|
|
397
|
+
let nudgedEpochNs = startEpochNs + roundedTime;
|
|
398
|
+
if (didRoundBeyondDay) {
|
|
399
|
+
roundedTime = roundTimeDurationToIncrement(beyondDaySpan, unitIncrement, roundingMode);
|
|
400
|
+
nudgedEpochNs = endEpochNs + roundedTime;
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
duration: {
|
|
404
|
+
date: adjustDateDuration(duration.date, duration.date.days + (didRoundBeyondDay ? sign : 0)),
|
|
405
|
+
time: roundedTime,
|
|
406
|
+
},
|
|
407
|
+
nudgedEpochNs,
|
|
408
|
+
didExpandCalendarUnit: didRoundBeyondDay,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
/** The date duration one `unit` further than `date`, per TC39 `BubbleRelativeDuration` step 6.a. */
|
|
412
|
+
function oneUnitFurther(date, unit, sign) {
|
|
413
|
+
if (unit === "year") {
|
|
414
|
+
return { ...ZERO_DATE_DURATION, years: date.years + sign };
|
|
415
|
+
}
|
|
416
|
+
if (unit === "month") {
|
|
417
|
+
return adjustDateDuration(date, 0, 0, date.months + sign);
|
|
418
|
+
}
|
|
419
|
+
return adjustDateDuration(date, 0, date.weeks + sign);
|
|
420
|
+
}
|
|
421
|
+
/** TC39 `BubbleRelativeDuration`. */
|
|
422
|
+
function bubbleRelativeDuration(sign, duration, nudgedEpochNs, context, largestUnit, smallestUnit) {
|
|
423
|
+
let bubbled = duration;
|
|
424
|
+
for (let index = UNITS.indexOf(smallestUnit) - 1; index >= UNITS.indexOf(largestUnit); index--) {
|
|
425
|
+
const unit = UNITS[index];
|
|
426
|
+
if (unit === "week" && largestUnit !== "week")
|
|
427
|
+
continue;
|
|
428
|
+
const endDuration = oneUnitFurther(bubbled.date, unit, sign);
|
|
429
|
+
const endEpochNs = windowBoundEpoch(context, endDuration);
|
|
430
|
+
if (bigintSign(nudgedEpochNs - endEpochNs) === -sign)
|
|
431
|
+
break;
|
|
432
|
+
bubbled = { date: endDuration, time: 0n };
|
|
433
|
+
}
|
|
434
|
+
return bubbled;
|
|
435
|
+
}
|
|
436
|
+
/** TC39 `RoundRelativeDuration` with a time zone. */
|
|
437
|
+
function roundRelativeDuration(duration, originEpochNs, destEpochNs, context, settings) {
|
|
438
|
+
const { largestUnit, smallestUnit } = settings;
|
|
439
|
+
const sign = internalDurationSign(duration) < 0 ? -1 : 1;
|
|
440
|
+
const nudgeResult = nudgeRelativeDuration(sign, duration, originEpochNs, destEpochNs, context, settings);
|
|
441
|
+
if (!nudgeResult.didExpandCalendarUnit || smallestUnit === "week") {
|
|
442
|
+
return nudgeResult.duration;
|
|
443
|
+
}
|
|
444
|
+
return bubbleRelativeDuration(sign, nudgeResult.duration, nudgeResult.nudgedEpochNs, context, largestUnit, largerUnit(smallestUnit, "day"));
|
|
445
|
+
}
|
|
446
|
+
/** TC39 `DifferenceZonedDateTimeWithRounding`. */
|
|
447
|
+
function differenceZonedDateTimeWithRounding(ns1, ns2, context, settings) {
|
|
448
|
+
const { largestUnit, smallestUnit, increment, roundingMode } = settings;
|
|
449
|
+
if (!isDateUnit(largestUnit)) {
|
|
450
|
+
// TC39 DifferenceInstant: the smallest unit is a time unit too.
|
|
451
|
+
return {
|
|
452
|
+
date: ZERO_DATE_DURATION,
|
|
453
|
+
time: roundTimeDurationToIncrement(ns2 - ns1, BigInt(increment) * NANOSECONDS_PER_TIME_UNIT[smallestUnit], roundingMode),
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
const difference = differenceZonedDateTime(ns1, ns2, context, largestUnit);
|
|
457
|
+
if (smallestUnit === "nanosecond" && increment === 1)
|
|
458
|
+
return difference;
|
|
459
|
+
return roundRelativeDuration(difference, ns1, ns2, { ...context, wall: isoDateTimeFor(context.timeZone, ns1) }, settings);
|
|
460
|
+
}
|
|
461
|
+
// ---------------------------------------------------------------------------------------------
|
|
462
|
+
// Plain context (defect 3, CORE-6 spec §3.6.3): no time zone, exact times are
|
|
463
|
+
// GetUTCEpochNanoseconds and are never checked against the instant range
|
|
464
|
+
// ---------------------------------------------------------------------------------------------
|
|
465
|
+
/** An ISO date far from the limits, used only to validate options. */
|
|
466
|
+
const PLAIN_DATE_PROBE = new Temporal.PlainDate(2000, 1, 1);
|
|
467
|
+
const PLAIN_DATE_TIME_PROBE = new Temporal.PlainDateTime(2000, 1, 1);
|
|
468
|
+
/** TC39 `IsCalendarUnit`. */
|
|
469
|
+
function isCalendarUnit(unit) {
|
|
470
|
+
return unit === "year" || unit === "month" || unit === "week";
|
|
471
|
+
}
|
|
472
|
+
/** TC39 `RoundRelativeDuration` steps 1–5: the nudge for `settings.smallestUnit` in `context`. */
|
|
473
|
+
function nudgeRelativeDuration(sign, duration, originEpochNs, destEpochNs, context, settings) {
|
|
474
|
+
const { largestUnit, smallestUnit, increment, roundingMode } = settings;
|
|
475
|
+
const { timeZone } = context;
|
|
476
|
+
// irregularLengthUnit: a calendar unit, or a day with a time zone.
|
|
477
|
+
if (isCalendarUnit(smallestUnit) ||
|
|
478
|
+
(timeZone !== undefined && smallestUnit === "day")) {
|
|
479
|
+
return nudgeToCalendarUnit(sign, duration, originEpochNs, destEpochNs, context, increment, smallestUnit, roundingMode).nudgeResult;
|
|
480
|
+
}
|
|
481
|
+
if (timeZone !== undefined) {
|
|
482
|
+
return nudgeToZonedTime(sign, duration, { ...context, timeZone }, increment, smallestUnit, roundingMode);
|
|
483
|
+
}
|
|
484
|
+
return nudgeToDayOrTime(duration, destEpochNs, largestUnit, increment, smallestUnit, roundingMode);
|
|
485
|
+
}
|
|
486
|
+
/** TC39 `NudgeToDayOrTime`. */
|
|
487
|
+
function nudgeToDayOrTime(duration, destEpochNs, largestUnit, increment, smallestUnit, roundingMode) {
|
|
488
|
+
const timeDuration = duration.time + BigInt(duration.date.days) * NANOSECONDS_PER_DAY;
|
|
489
|
+
const unitLength = smallestUnit === "day"
|
|
490
|
+
? NANOSECONDS_PER_DAY
|
|
491
|
+
: NANOSECONDS_PER_TIME_UNIT[smallestUnit];
|
|
492
|
+
const roundedTime = roundTimeDurationToIncrement(timeDuration, unitLength * BigInt(increment), roundingMode);
|
|
493
|
+
// TotalTimeDuration(…, day) truncated: bigint division truncates toward zero.
|
|
494
|
+
const wholeDays = timeDuration / NANOSECONDS_PER_DAY;
|
|
495
|
+
const roundedWholeDays = roundedTime / NANOSECONDS_PER_DAY;
|
|
496
|
+
const keepsDays = isDateUnit(largestUnit);
|
|
497
|
+
return {
|
|
498
|
+
duration: {
|
|
499
|
+
date: adjustDateDuration(duration.date, keepsDays ? Number(roundedWholeDays) : 0),
|
|
500
|
+
time: keepsDays
|
|
501
|
+
? roundedTime - roundedWholeDays * NANOSECONDS_PER_DAY
|
|
502
|
+
: roundedTime,
|
|
503
|
+
},
|
|
504
|
+
nudgedEpochNs: destEpochNs + (roundedTime - timeDuration),
|
|
505
|
+
didExpandCalendarUnit: bigintSign(roundedWholeDays - wholeDays) === bigintSign(timeDuration),
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
/** Nanoseconds since midnight on `wall`'s own date. */
|
|
509
|
+
function timeOfDayNanoseconds(wall) {
|
|
510
|
+
return (BigInt(wall.hour) * NANOSECONDS_PER_TIME_UNIT.hour +
|
|
511
|
+
BigInt(wall.minute) * NANOSECONDS_PER_TIME_UNIT.minute +
|
|
512
|
+
BigInt(wall.second) * NANOSECONDS_PER_TIME_UNIT.second +
|
|
513
|
+
BigInt(wall.millisecond) * NANOSECONDS_PER_TIME_UNIT.millisecond +
|
|
514
|
+
BigInt(wall.microsecond) * NANOSECONDS_PER_TIME_UNIT.microsecond +
|
|
515
|
+
BigInt(wall.nanosecond));
|
|
516
|
+
}
|
|
517
|
+
/** TC39 `DifferenceISODateTime`, for two ISO-calendar wall clocks. */
|
|
518
|
+
function differenceISODateTime(one, two, calendar, largestUnit) {
|
|
519
|
+
let time = timeOfDayNanoseconds(two) - timeOfDayNanoseconds(one);
|
|
520
|
+
const timeSign = bigintSign(time);
|
|
521
|
+
const dateSign = Temporal.PlainDate.compare(one.toPlainDate(), two.toPlainDate());
|
|
522
|
+
let adjustedDate = two.toPlainDate();
|
|
523
|
+
if (timeSign === dateSign) {
|
|
524
|
+
adjustedDate = adjustedDate.add({ days: timeSign });
|
|
525
|
+
time -= BigInt(timeSign) * NANOSECONDS_PER_DAY;
|
|
526
|
+
}
|
|
527
|
+
const dateLargestUnit = largerUnit("day", largestUnit);
|
|
528
|
+
const date = calendarDateUntil(calendar, one.toPlainDate(), adjustedDate, dateLargestUnit);
|
|
529
|
+
if (largestUnit === dateLargestUnit) {
|
|
530
|
+
return { date, time };
|
|
531
|
+
}
|
|
532
|
+
return {
|
|
533
|
+
date: adjustDateDuration(date, 0),
|
|
534
|
+
time: time + BigInt(date.days) * NANOSECONDS_PER_DAY,
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
function plainContext(calendar, wall) {
|
|
538
|
+
return { timeZone: undefined, calendar, wall };
|
|
539
|
+
}
|
|
540
|
+
/** TC39 `DifferencePlainDateTimeWithRounding`. */
|
|
541
|
+
function differencePlainDateTimeWithRounding(one, two, calendar, settings) {
|
|
542
|
+
if (Temporal.PlainDateTime.compare(one, two) === 0) {
|
|
543
|
+
return { date: ZERO_DATE_DURATION, time: 0n };
|
|
544
|
+
}
|
|
545
|
+
const difference = differenceISODateTime(one, two, calendar, settings.largestUnit);
|
|
546
|
+
if (settings.smallestUnit === "nanosecond" && settings.increment === 1) {
|
|
547
|
+
return difference;
|
|
548
|
+
}
|
|
549
|
+
return roundRelativeDuration(difference, utcEpochNanoseconds(one), utcEpochNanoseconds(two), plainContext(calendar, one), settings);
|
|
550
|
+
}
|
|
551
|
+
/** TC39 `DifferencePlainDateTimeWithTotal`. */
|
|
552
|
+
function differencePlainDateTimeWithTotal(one, two, calendar, unit) {
|
|
553
|
+
if (Temporal.PlainDateTime.compare(one, two) === 0)
|
|
554
|
+
return 0;
|
|
555
|
+
const difference = differenceISODateTime(one, two, calendar, unit);
|
|
556
|
+
if (isCalendarUnit(unit)) {
|
|
557
|
+
// TC39 TotalRelativeDuration for a calendar unit.
|
|
558
|
+
return nudgeToCalendarUnit(internalDurationSign(difference) < 0 ? -1 : 1, difference, utcEpochNanoseconds(one), utcEpochNanoseconds(two), plainContext(calendar, one), 1, unit, "trunc").total;
|
|
559
|
+
}
|
|
560
|
+
return divideToNumber(difference.time + BigInt(difference.date.days) * NANOSECONDS_PER_DAY, unit === "day" ? NANOSECONDS_PER_DAY : NANOSECONDS_PER_TIME_UNIT[unit]);
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* The origin and target wall clocks TC39 `Duration#round` / `Duration#total` build from a plain
|
|
564
|
+
* `relativeTo`: `ToInternalDurationRecordWith24HourDays`, `AddTime` from midnight, and
|
|
565
|
+
* `CalendarDateAdd` of the date part plus the whole days that carried out of the time.
|
|
566
|
+
*/
|
|
567
|
+
function plainRelativeTarget(duration, plain) {
|
|
568
|
+
const internal = toInternalDuration(duration);
|
|
569
|
+
const time = internal.time + BigInt(internal.date.days) * NANOSECONDS_PER_DAY;
|
|
570
|
+
let carriedDays = time / NANOSECONDS_PER_DAY;
|
|
571
|
+
let timeOfDay = time % NANOSECONDS_PER_DAY;
|
|
572
|
+
if (timeOfDay < 0n) {
|
|
573
|
+
carriedDays -= 1n;
|
|
574
|
+
timeOfDay += NANOSECONDS_PER_DAY;
|
|
575
|
+
}
|
|
576
|
+
const origin = plain.withCalendar("iso8601").toPlainDateTime();
|
|
577
|
+
const targetDate = calendarDateAdd(plain.calendarId, origin.toPlainDate(), adjustDateDuration(internal.date, Number(carriedDays)));
|
|
578
|
+
return {
|
|
579
|
+
origin,
|
|
580
|
+
target: targetDate
|
|
581
|
+
.toPlainDateTime()
|
|
582
|
+
.add({ nanoseconds: Number(timeOfDay) }),
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
/** TC39 `DateDurationDays`. */
|
|
586
|
+
function dateDurationDays(date, plain) {
|
|
587
|
+
const yearsMonthsWeeks = adjustDateDuration(date, 0);
|
|
588
|
+
if (dateDurationSign(yearsMonthsWeeks) === 0)
|
|
589
|
+
return date.days;
|
|
590
|
+
const isoDate = plain.withCalendar("iso8601");
|
|
591
|
+
const later = calendarDateAdd(plain.calendarId, isoDate, yearsMonthsWeeks);
|
|
592
|
+
return date.days + isoDate.until(later, { largestUnit: "day" }).days;
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* `PlainDate#until(other, options)` with rounding options for two dates in one calendar, as TC39
|
|
596
|
+
* `DifferenceTemporalPlainDate` computes it: `CalendarDateUntil` through the Temporal compat layer,
|
|
597
|
+
* then — unless the granularity is one day — `RoundRelativeDuration` in a plain context.
|
|
598
|
+
*
|
|
599
|
+
* @param one the start, in the calendar to measure in
|
|
600
|
+
* @param two the end, in the same calendar
|
|
601
|
+
* @param options Temporal `largestUnit` / `smallestUnit` / `roundingIncrement` / `roundingMode`
|
|
602
|
+
* @returns the rounded date duration; throws where TC39 Temporal throws
|
|
603
|
+
*/
|
|
604
|
+
export function plainDateUntilWithRounding(one, two, options) {
|
|
605
|
+
// Validates the options exactly as PlainDate#until does, far from any limit.
|
|
606
|
+
PLAIN_DATE_PROBE.until(PLAIN_DATE_PROBE, options);
|
|
607
|
+
const settings = roundingSettings(options.largestUnit, options.smallestUnit ?? "day", (smallestUnit) => largerUnit("day", smallestUnit), options.roundingIncrement, options.roundingMode ?? "trunc");
|
|
608
|
+
if (Temporal.PlainDate.compare(one, two) === 0) {
|
|
609
|
+
return new Temporal.Duration();
|
|
610
|
+
}
|
|
611
|
+
const calendar = one.calendarId;
|
|
612
|
+
const start = one.withCalendar("iso8601").toPlainDateTime();
|
|
613
|
+
const end = two.withCalendar("iso8601").toPlainDateTime();
|
|
614
|
+
let duration = {
|
|
615
|
+
date: calendarDateUntil(calendar, start.toPlainDate(), end.toPlainDate(), settings.largestUnit),
|
|
616
|
+
time: 0n,
|
|
617
|
+
};
|
|
618
|
+
if (settings.smallestUnit !== "day" || settings.increment !== 1) {
|
|
619
|
+
duration = roundRelativeDuration(duration, utcEpochNanoseconds(start), utcEpochNanoseconds(end), plainContext(calendar, start), settings);
|
|
620
|
+
}
|
|
621
|
+
const { years, months, weeks, days } = duration.date;
|
|
622
|
+
return new Temporal.Duration(years, months, weeks, days);
|
|
623
|
+
}
|
|
624
|
+
// ---------------------------------------------------------------------------------------------
|
|
625
|
+
// Fallbacks (defect 1): the TC39 result, or null to re-throw the polyfill's error
|
|
626
|
+
// ---------------------------------------------------------------------------------------------
|
|
627
|
+
/** Runs `validate` (a polyfill call far from the limits); null when the options are invalid. */
|
|
628
|
+
function optionsAreValid(validate) {
|
|
629
|
+
try {
|
|
630
|
+
validate();
|
|
631
|
+
return true;
|
|
632
|
+
}
|
|
633
|
+
catch {
|
|
634
|
+
return false;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
function contextOf(zoned) {
|
|
638
|
+
return { timeZone: zoned.timeZoneId, calendar: zoned.calendarId };
|
|
639
|
+
}
|
|
640
|
+
/** TC39 `DifferenceTemporalZonedDateTime(~until~, …)` for a date `largestUnit`. */
|
|
641
|
+
function untilAtLimit(one, two, options, settings) {
|
|
642
|
+
if (!optionsAreValid(() => OPTIONS_PROBE.until(OPTIONS_PROBE, options)) ||
|
|
643
|
+
!isDateUnit(settings.largestUnit) ||
|
|
644
|
+
one.calendarId !== two.calendarId) {
|
|
645
|
+
return null;
|
|
646
|
+
}
|
|
647
|
+
const difference = differenceZonedDateTimeWithRounding(one.epochNanoseconds, two.epochNanoseconds, contextOf(one), settings);
|
|
648
|
+
return temporalDurationFromInternal(difference, "hour");
|
|
649
|
+
}
|
|
650
|
+
/** `Duration#total` with a zoned `relativeTo`: TC39 `DifferenceZonedDateTimeWithTotal`. */
|
|
651
|
+
function totalAtLimit(duration, zoned, unitOption, unit) {
|
|
652
|
+
if (!optionsAreValid(() => ZERO_DURATION.total({
|
|
653
|
+
unit: unitOption,
|
|
654
|
+
relativeTo: OPTIONS_PROBE,
|
|
655
|
+
}))) {
|
|
656
|
+
return null;
|
|
657
|
+
}
|
|
658
|
+
const origin = zoned.epochNanoseconds;
|
|
659
|
+
const target = addZonedDateTime(zoned, toInternalDuration(duration));
|
|
660
|
+
if (!isDateUnit(unit)) {
|
|
661
|
+
// TC39 TotalTimeDuration
|
|
662
|
+
return divideToNumber(target - origin, NANOSECONDS_PER_TIME_UNIT[unit]);
|
|
663
|
+
}
|
|
664
|
+
const context = contextOf(zoned);
|
|
665
|
+
const difference = differenceZonedDateTime(origin, target, context, unit);
|
|
666
|
+
// TC39 TotalRelativeDuration: a calendar unit, or a day with a time zone.
|
|
667
|
+
return nudgeToCalendarUnit(internalDurationSign(difference) < 0 ? -1 : 1, difference, origin, target, { ...context, wall: isoDateTimeFor(context.timeZone, origin) }, 1, unit, "trunc").total;
|
|
668
|
+
}
|
|
669
|
+
/** `Duration#round` with a zoned `relativeTo`. */
|
|
670
|
+
function roundAtLimit(duration, zoned, roundTo, settings) {
|
|
671
|
+
if (!canRoundBySpec(roundTo, settings, OPTIONS_PROBE)) {
|
|
672
|
+
return null;
|
|
673
|
+
}
|
|
674
|
+
const { largestUnit } = settings;
|
|
675
|
+
const target = addZonedDateTime(zoned, toInternalDuration(duration));
|
|
676
|
+
const rounded = differenceZonedDateTimeWithRounding(zoned.epochNanoseconds, target, contextOf(zoned), settings);
|
|
677
|
+
return temporalDurationFromInternal(rounded, isDateUnit(largestUnit) ? "hour" : largestUnit);
|
|
678
|
+
}
|
|
679
|
+
/** `Temporal.Duration.compare` with a zoned `relativeTo`, when either operand has date units. */
|
|
680
|
+
function compareAtLimit(one, two, zoned) {
|
|
681
|
+
if (!isDateUnit(defaultLargestUnit(one)) &&
|
|
682
|
+
!isDateUnit(defaultLargestUnit(two))) {
|
|
683
|
+
return null;
|
|
684
|
+
}
|
|
685
|
+
const after1 = addZonedDateTime(zoned, toInternalDuration(one));
|
|
686
|
+
const after2 = addZonedDateTime(zoned, toInternalDuration(two));
|
|
687
|
+
return bigintSign(after1 - after2);
|
|
688
|
+
}
|
|
689
|
+
// ---------------------------------------------------------------------------------------------
|
|
690
|
+
// Polyfill-first wrappers
|
|
691
|
+
// ---------------------------------------------------------------------------------------------
|
|
692
|
+
/** True when `epochs`, widened by `reach` and the limit margin, touch either range limit. */
|
|
693
|
+
function reachesRangeLimit(epochs, reach) {
|
|
694
|
+
const widen = reach + LIMIT_MARGIN;
|
|
695
|
+
return epochs.some((epoch) => epoch - widen <= MIN_EPOCH_NANOSECONDS ||
|
|
696
|
+
epoch + widen >= MAX_EPOCH_NANOSECONDS);
|
|
697
|
+
}
|
|
698
|
+
/** An upper bound on how far `duration` moves an exact time in any zone. */
|
|
699
|
+
function durationReach(duration) {
|
|
700
|
+
const { date, time } = toInternalDuration(duration);
|
|
701
|
+
return (BigInt(Math.abs(date.years)) * UNIT_REACH.year +
|
|
702
|
+
BigInt(Math.abs(date.months)) * UNIT_REACH.month +
|
|
703
|
+
BigInt(Math.abs(date.weeks)) * UNIT_REACH.week +
|
|
704
|
+
BigInt(Math.abs(date.days)) * UNIT_REACH.day +
|
|
705
|
+
bigintAbs(time));
|
|
706
|
+
}
|
|
707
|
+
/** How far rounding can look past its destination: one increment, then bubbling to `largestUnit`. */
|
|
708
|
+
function roundingReach(settings) {
|
|
709
|
+
const increment = Number.isSafeInteger(settings.increment)
|
|
710
|
+
? Math.abs(settings.increment)
|
|
711
|
+
: 1;
|
|
712
|
+
return (UNIT_REACH[settings.largestUnit] +
|
|
713
|
+
BigInt(Math.max(increment, 1)) * UNIT_REACH[settings.smallestUnit]);
|
|
714
|
+
}
|
|
715
|
+
/** Resolves the units of `until`/`round` options; null when a unit name is not one Temporal knows. */
|
|
716
|
+
function roundingSettings(largestUnitOption, smallestUnitOption, defaultLargestUnitFor, increment, roundingMode) {
|
|
717
|
+
const smallestUnit = smallestUnitOption === undefined
|
|
718
|
+
? "nanosecond"
|
|
719
|
+
: toUnit(smallestUnitOption);
|
|
720
|
+
if (smallestUnit === null)
|
|
721
|
+
return null;
|
|
722
|
+
const largestUnit = largestUnitOption === undefined || largestUnitOption === "auto"
|
|
723
|
+
? defaultLargestUnitFor(smallestUnit)
|
|
724
|
+
: toUnit(largestUnitOption);
|
|
725
|
+
if (largestUnit === null)
|
|
726
|
+
return null;
|
|
727
|
+
return {
|
|
728
|
+
largestUnit,
|
|
729
|
+
smallestUnit,
|
|
730
|
+
increment: increment ?? 1,
|
|
731
|
+
roundingMode,
|
|
732
|
+
};
|
|
733
|
+
}
|
|
734
|
+
/** Defect 2: the spec validates every UTC exact time; `+00:00` resolves identically and does. */
|
|
735
|
+
function checkUtcValidity(compute) {
|
|
736
|
+
compute(UTC_EQUIVALENT_OFFSET_ZONE);
|
|
737
|
+
}
|
|
738
|
+
/**
|
|
739
|
+
* Returns `compute(timeZone)`, the polyfill's own result, unchanged. Near a range limit only:
|
|
740
|
+
* a UTC result is checked with `checkUtcValidity` (defect 2), and a named zone's error is
|
|
741
|
+
* replaced by `fallback`'s TC39 result when it has one (defect 1).
|
|
742
|
+
*/
|
|
743
|
+
function runAtRangeLimit(timeZone, atRangeLimit, compute, fallback) {
|
|
744
|
+
let result;
|
|
745
|
+
try {
|
|
746
|
+
result = compute(timeZone);
|
|
747
|
+
}
|
|
748
|
+
catch (error) {
|
|
749
|
+
if (!atRangeLimit || !isNamedTimeZone(timeZone))
|
|
750
|
+
throw error;
|
|
751
|
+
const recovered = fallback();
|
|
752
|
+
if (recovered === null)
|
|
753
|
+
throw error;
|
|
754
|
+
return recovered;
|
|
755
|
+
}
|
|
756
|
+
if (atRangeLimit && timeZone === "UTC") {
|
|
757
|
+
checkUtcValidity(compute);
|
|
758
|
+
}
|
|
759
|
+
return result;
|
|
760
|
+
}
|
|
761
|
+
function inTimeZone(zoned, timeZone) {
|
|
762
|
+
return zoned.timeZoneId === timeZone ? zoned : zoned.withTimeZone(timeZone);
|
|
763
|
+
}
|
|
764
|
+
/** The zoned `relativeTo` Temporal would resolve, or null when it is not zoned. */
|
|
765
|
+
function zonedRelativeTo(relativeTo) {
|
|
766
|
+
if (relativeTo instanceof Temporal.ZonedDateTime)
|
|
767
|
+
return relativeTo;
|
|
768
|
+
try {
|
|
769
|
+
if (typeof relativeTo === "string") {
|
|
770
|
+
return timeZoneAnnotation.test(relativeTo)
|
|
771
|
+
? zonedDateTimeFrom(relativeTo)
|
|
772
|
+
: null;
|
|
773
|
+
}
|
|
774
|
+
if (typeof relativeTo === "object" &&
|
|
775
|
+
!(relativeTo instanceof Temporal.PlainDateTime) &&
|
|
776
|
+
"timeZone" in relativeTo &&
|
|
777
|
+
relativeTo.timeZone !== undefined) {
|
|
778
|
+
return zonedDateTimeFrom(relativeTo);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
catch {
|
|
782
|
+
// Not a valid zoned relativeTo: the polyfill call reports it.
|
|
783
|
+
}
|
|
784
|
+
return null;
|
|
785
|
+
}
|
|
786
|
+
const CALENDAR_DIFFERENCE_UNITS = new Set([
|
|
787
|
+
"year",
|
|
788
|
+
"years",
|
|
789
|
+
"month",
|
|
790
|
+
"months",
|
|
791
|
+
"week",
|
|
792
|
+
"weeks",
|
|
793
|
+
"day",
|
|
794
|
+
"days",
|
|
795
|
+
]);
|
|
796
|
+
/**
|
|
797
|
+
* Whether Temporal's DifferenceTemporalZonedDateTime would reject `largestUnit` for this pair: a
|
|
798
|
+
* calendar unit (day or larger) between two different time zones (TimeZoneEquals is false), because
|
|
799
|
+
* "day lengths can vary between time zones due to DST". `ZonedDateTime#equals` applies TC39
|
|
800
|
+
* TimeZoneEquals, so `UTC` equals `Etc/UTC` and `Asia/Calcutta` equals `Asia/Kolkata`.
|
|
801
|
+
*
|
|
802
|
+
* @param one the start
|
|
803
|
+
* @param two the end
|
|
804
|
+
* @param largestUnit the requested `largestUnit`
|
|
805
|
+
* @returns true when the pair cannot be differenced in `largestUnit`
|
|
806
|
+
*/
|
|
807
|
+
export function isCalendarDifferenceAcrossZones(one, two, largestUnit) {
|
|
808
|
+
if (!CALENDAR_DIFFERENCE_UNITS.has(largestUnit))
|
|
809
|
+
return false;
|
|
810
|
+
return !new Temporal.ZonedDateTime(0n, one.timeZoneId).equals(new Temporal.ZonedDateTime(0n, two.timeZoneId));
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* `ZonedDateTime#until`, correct at the range limits (see the note at the top of this file).
|
|
814
|
+
*
|
|
815
|
+
* @param one the start
|
|
816
|
+
* @param two the end
|
|
817
|
+
* @param options Temporal `largestUnit` / `smallestUnit` / `roundingIncrement` / `roundingMode`
|
|
818
|
+
* @returns the difference; throws where TC39 Temporal throws
|
|
819
|
+
*/
|
|
820
|
+
export function zonedUntil(one, two, options = {}) {
|
|
821
|
+
const settings = roundingSettings(options.largestUnit, options.smallestUnit, (smallestUnit) => largerUnit("hour", smallestUnit), options.roundingIncrement, options.roundingMode ?? "trunc");
|
|
822
|
+
// Defect 3: a calendar whose arithmetic the polyfill gets wrong takes the spec path outright,
|
|
823
|
+
// because a wrong month-end difference (D6) is returned, not thrown.
|
|
824
|
+
if (settings !== null &&
|
|
825
|
+
one.timeZoneId === two.timeZoneId &&
|
|
826
|
+
one.calendarId === two.calendarId &&
|
|
827
|
+
isCalendarArithmeticCompatNeeded(one.calendarId)) {
|
|
828
|
+
const bySpec = untilAtLimit(one, two, options, settings);
|
|
829
|
+
if (bySpec !== null)
|
|
830
|
+
return bySpec;
|
|
831
|
+
}
|
|
832
|
+
// Defect 4: the polyfill rounds over a nudge window that need not contain the target, so a
|
|
833
|
+
// calendar `smallestUnit` from a day that a month add would constrain takes the spec path too.
|
|
834
|
+
if (settings !== null &&
|
|
835
|
+
one.timeZoneId === two.timeZoneId &&
|
|
836
|
+
one.calendarId === two.calendarId &&
|
|
837
|
+
isNudgeWindowUnit(settings.smallestUnit) &&
|
|
838
|
+
one.day >= 29 &&
|
|
839
|
+
isNudgeWindowCompatNeeded()) {
|
|
840
|
+
const bySpec = untilAtLimit(one, two, options, settings);
|
|
841
|
+
if (bySpec !== null)
|
|
842
|
+
return bySpec;
|
|
843
|
+
}
|
|
844
|
+
const atRangeLimit = settings !== null &&
|
|
845
|
+
one.timeZoneId === two.timeZoneId &&
|
|
846
|
+
reachesRangeLimit([one.epochNanoseconds, two.epochNanoseconds], roundingReach(settings));
|
|
847
|
+
return runAtRangeLimit(one.timeZoneId, atRangeLimit, (timeZone) => inTimeZone(one, timeZone).until(inTimeZone(two, timeZone), options), () => untilAtLimit(one, two, options, settings));
|
|
848
|
+
}
|
|
849
|
+
/** True when `Duration#round` accepts `roundTo` with `settings`, checked far from any limit. */
|
|
850
|
+
function canRoundBySpec(roundTo, settings, probe) {
|
|
851
|
+
const { largestUnit, smallestUnit, increment } = settings;
|
|
852
|
+
return (optionsAreValid(() => ZERO_DURATION.round({
|
|
853
|
+
...roundTo,
|
|
854
|
+
relativeTo: probe,
|
|
855
|
+
})) &&
|
|
856
|
+
largerUnit(largestUnit, smallestUnit) === largestUnit &&
|
|
857
|
+
!(increment > 1 && largestUnit !== smallestUnit && isDateUnit(smallestUnit)));
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* The plain `relativeTo` Temporal would resolve (TC39 `ToRelativeTemporalObject` keeps only the
|
|
861
|
+
* date) when its calendar needs the Temporal compat layer in this runtime, or null. A string with
|
|
862
|
+
* no calendar annotation is ISO, so it is never parsed here.
|
|
863
|
+
*/
|
|
864
|
+
function plainRelativeToNeedingCompat(relativeTo) {
|
|
865
|
+
let plain;
|
|
866
|
+
try {
|
|
867
|
+
if (relativeTo instanceof Temporal.PlainDateTime) {
|
|
868
|
+
plain = relativeTo.toPlainDate();
|
|
869
|
+
}
|
|
870
|
+
else if (typeof relativeTo === "string" &&
|
|
871
|
+
relativeTo.includes("u-ca=") &&
|
|
872
|
+
!timeZoneAnnotation.test(relativeTo)) {
|
|
873
|
+
plain = Temporal.PlainDate.from(relativeTo);
|
|
874
|
+
}
|
|
875
|
+
else {
|
|
876
|
+
return null;
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
catch {
|
|
880
|
+
return null;
|
|
881
|
+
}
|
|
882
|
+
return isCalendarArithmeticCompatNeeded(plain.calendarId) ? plain : null;
|
|
883
|
+
}
|
|
884
|
+
/** `Duration#total` with a plain `relativeTo`: TC39 `DifferencePlainDateTimeWithTotal`. */
|
|
885
|
+
function totalWithPlainRelativeTo(duration, plain, unitOption, unit) {
|
|
886
|
+
if (!optionsAreValid(() => ZERO_DURATION.total({
|
|
887
|
+
unit: unitOption,
|
|
888
|
+
relativeTo: PLAIN_DATE_PROBE,
|
|
889
|
+
}))) {
|
|
890
|
+
return null;
|
|
891
|
+
}
|
|
892
|
+
const { origin, target } = plainRelativeTarget(duration, plain);
|
|
893
|
+
return differencePlainDateTimeWithTotal(origin, target, plain.calendarId, unit);
|
|
894
|
+
}
|
|
895
|
+
/** `Duration#round` with a plain `relativeTo`: TC39 `DifferencePlainDateTimeWithRounding`. */
|
|
896
|
+
function roundWithPlainRelativeTo(duration, plain, roundTo, settings) {
|
|
897
|
+
if (!canRoundBySpec(roundTo, settings, PLAIN_DATE_PROBE)) {
|
|
898
|
+
return null;
|
|
899
|
+
}
|
|
900
|
+
const { origin, target } = plainRelativeTarget(duration, plain);
|
|
901
|
+
const rounded = differencePlainDateTimeWithRounding(origin, target, plain.calendarId, settings);
|
|
902
|
+
return temporalDurationFromInternal(rounded, isDateUnit(settings.largestUnit)
|
|
903
|
+
? "hour"
|
|
904
|
+
: settings.largestUnit);
|
|
905
|
+
}
|
|
906
|
+
/** `Temporal.Duration.compare` with a plain `relativeTo`, when either operand has calendar units. */
|
|
907
|
+
function compareWithPlainRelativeTo(one, two, plain) {
|
|
908
|
+
if (!isCalendarUnit(defaultLargestUnit(one)) &&
|
|
909
|
+
!isCalendarUnit(defaultLargestUnit(two))) {
|
|
910
|
+
return null;
|
|
911
|
+
}
|
|
912
|
+
const first = toInternalDuration(one);
|
|
913
|
+
const second = toInternalDuration(two);
|
|
914
|
+
const time1 = first.time +
|
|
915
|
+
BigInt(dateDurationDays(first.date, plain)) * NANOSECONDS_PER_DAY;
|
|
916
|
+
const time2 = second.time +
|
|
917
|
+
BigInt(dateDurationDays(second.date, plain)) * NANOSECONDS_PER_DAY;
|
|
918
|
+
return bigintSign(time1 - time2);
|
|
919
|
+
}
|
|
920
|
+
/** Defect 3: `Duration#total` by the spec when the `relativeTo` calendar needs the compat layer. */
|
|
921
|
+
function calendarTotalBySpec(duration, unitOption, unit, relativeTo, zoned) {
|
|
922
|
+
if (zoned !== null) {
|
|
923
|
+
return isCalendarArithmeticCompatNeeded(zoned.calendarId)
|
|
924
|
+
? totalAtLimit(duration, zoned, unitOption, unit)
|
|
925
|
+
: null;
|
|
926
|
+
}
|
|
927
|
+
const plain = plainRelativeToNeedingCompat(relativeTo);
|
|
928
|
+
return plain === null
|
|
929
|
+
? null
|
|
930
|
+
: totalWithPlainRelativeTo(duration, plain, unitOption, unit);
|
|
931
|
+
}
|
|
932
|
+
/**
|
|
933
|
+
* Units whose nudge window can miss its target: only a month, or a year that carries months with it.
|
|
934
|
+
* A week or a day is a fixed count of days, so `relativeTo + r1 units` never has to constrain.
|
|
935
|
+
*/
|
|
936
|
+
function isNudgeWindowUnit(unit) {
|
|
937
|
+
return unit === "month" || unit === "year";
|
|
938
|
+
}
|
|
939
|
+
/**
|
|
940
|
+
* The day of month a `relativeTo` resolves to, or 0 when there is none to read.
|
|
941
|
+
*
|
|
942
|
+
* Only the 29th, 30th and 31st can reach defect 4: below that, adding a month never constrains
|
|
943
|
+
* the day, so the two denominators coincide and the polyfill's answer is already the spec's.
|
|
944
|
+
*/
|
|
945
|
+
function relativeToDayOfMonth(relativeTo, zoned) {
|
|
946
|
+
if (zoned !== null) {
|
|
947
|
+
return zoned.day;
|
|
948
|
+
}
|
|
949
|
+
try {
|
|
950
|
+
if (relativeTo instanceof Temporal.PlainDateTime) {
|
|
951
|
+
return relativeTo.day;
|
|
952
|
+
}
|
|
953
|
+
if (relativeTo instanceof Temporal.PlainDate) {
|
|
954
|
+
return relativeTo.day;
|
|
955
|
+
}
|
|
956
|
+
if (typeof relativeTo === "string") {
|
|
957
|
+
return Temporal.PlainDate.from(relativeTo).day;
|
|
958
|
+
}
|
|
959
|
+
if (relativeTo !== null && typeof relativeTo === "object") {
|
|
960
|
+
return Temporal.PlainDate.from(relativeTo).day;
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
catch {
|
|
964
|
+
return 0;
|
|
965
|
+
}
|
|
966
|
+
return 0;
|
|
967
|
+
}
|
|
968
|
+
/** The plain `relativeTo` Temporal would resolve, whatever its calendar, or null. */
|
|
969
|
+
function plainRelativeTo(relativeTo) {
|
|
970
|
+
try {
|
|
971
|
+
if (relativeTo instanceof Temporal.PlainDate) {
|
|
972
|
+
return relativeTo;
|
|
973
|
+
}
|
|
974
|
+
if (relativeTo instanceof Temporal.PlainDateTime) {
|
|
975
|
+
return relativeTo.toPlainDate();
|
|
976
|
+
}
|
|
977
|
+
if (typeof relativeTo === "string" &&
|
|
978
|
+
!timeZoneAnnotation.test(relativeTo)) {
|
|
979
|
+
return Temporal.PlainDate.from(relativeTo);
|
|
980
|
+
}
|
|
981
|
+
if (relativeTo !== null &&
|
|
982
|
+
typeof relativeTo === "object" &&
|
|
983
|
+
!(relativeTo instanceof Temporal.ZonedDateTime)) {
|
|
984
|
+
return Temporal.PlainDate.from(relativeTo);
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
catch {
|
|
988
|
+
return null;
|
|
989
|
+
}
|
|
990
|
+
return null;
|
|
991
|
+
}
|
|
992
|
+
/**
|
|
993
|
+
* Defect 4: `Duration#total` by the spec when the polyfill would divide the month fraction by the
|
|
994
|
+
* wrong month. Returns null whenever the defect cannot apply, leaving the polyfill's own answer.
|
|
995
|
+
*/
|
|
996
|
+
function monthTotalBySpec(duration, unitOption, unit, relativeTo, zoned) {
|
|
997
|
+
if (!isNudgeWindowUnit(unit) ||
|
|
998
|
+
relativeToDayOfMonth(relativeTo, zoned) < 29 ||
|
|
999
|
+
!isNudgeWindowCompatNeeded()) {
|
|
1000
|
+
return null;
|
|
1001
|
+
}
|
|
1002
|
+
if (zoned !== null) {
|
|
1003
|
+
return totalAtLimit(duration, zoned, unitOption, unit);
|
|
1004
|
+
}
|
|
1005
|
+
const plain = plainRelativeTo(relativeTo);
|
|
1006
|
+
return plain === null
|
|
1007
|
+
? null
|
|
1008
|
+
: totalWithPlainRelativeTo(duration, plain, unitOption, unit);
|
|
1009
|
+
}
|
|
1010
|
+
/**
|
|
1011
|
+
* Defect 4: `Duration#round` by the spec when the polyfill would round over a nudge window that
|
|
1012
|
+
* does not contain the target. Returns null whenever the defect cannot apply, leaving the
|
|
1013
|
+
* polyfill's own answer.
|
|
1014
|
+
*/
|
|
1015
|
+
function monthRoundBySpec(duration, roundTo, settings, zoned) {
|
|
1016
|
+
if (!isNudgeWindowUnit(settings.smallestUnit) ||
|
|
1017
|
+
relativeToDayOfMonth(roundTo.relativeTo, zoned) < 29 ||
|
|
1018
|
+
!isNudgeWindowCompatNeeded()) {
|
|
1019
|
+
return null;
|
|
1020
|
+
}
|
|
1021
|
+
if (zoned !== null) {
|
|
1022
|
+
return roundAtLimit(duration, zoned, roundTo, settings);
|
|
1023
|
+
}
|
|
1024
|
+
const plain = plainRelativeTo(roundTo.relativeTo);
|
|
1025
|
+
return plain === null
|
|
1026
|
+
? null
|
|
1027
|
+
: roundWithPlainRelativeTo(duration, plain, roundTo, settings);
|
|
1028
|
+
}
|
|
1029
|
+
/** Defect 3: `Duration#round` by the spec when the `relativeTo` calendar needs the compat layer. */
|
|
1030
|
+
function calendarRoundBySpec(duration, roundTo, settings, zoned) {
|
|
1031
|
+
if (zoned !== null) {
|
|
1032
|
+
return isCalendarArithmeticCompatNeeded(zoned.calendarId)
|
|
1033
|
+
? roundAtLimit(duration, zoned, roundTo, settings)
|
|
1034
|
+
: null;
|
|
1035
|
+
}
|
|
1036
|
+
const plain = plainRelativeToNeedingCompat(roundTo.relativeTo);
|
|
1037
|
+
return plain === null
|
|
1038
|
+
? null
|
|
1039
|
+
: roundWithPlainRelativeTo(duration, plain, roundTo, settings);
|
|
1040
|
+
}
|
|
1041
|
+
/** Defect 3: `Duration.compare` by the spec when the `relativeTo` calendar needs the compat layer. */
|
|
1042
|
+
function calendarCompareBySpec(one, two, relativeTo, zoned) {
|
|
1043
|
+
if (zoned !== null) {
|
|
1044
|
+
return isCalendarArithmeticCompatNeeded(zoned.calendarId)
|
|
1045
|
+
? compareAtLimit(Temporal.Duration.from(one), Temporal.Duration.from(two), zoned)
|
|
1046
|
+
: null;
|
|
1047
|
+
}
|
|
1048
|
+
const plain = plainRelativeToNeedingCompat(relativeTo);
|
|
1049
|
+
return plain === null
|
|
1050
|
+
? null
|
|
1051
|
+
: compareWithPlainRelativeTo(Temporal.Duration.from(one), Temporal.Duration.from(two), plain);
|
|
1052
|
+
}
|
|
1053
|
+
/**
|
|
1054
|
+
* `PlainDateTime#until` / `#since`, correct when the polyfill would round over a nudge window that
|
|
1055
|
+
* does not contain the target (defect 4).
|
|
1056
|
+
*
|
|
1057
|
+
* The plain difference functions round through the polyfill directly, because neither the range
|
|
1058
|
+
* limits nor the non-ISO calendars reach them the way they reach the zoned ones. A calendar
|
|
1059
|
+
* `smallestUnit` measured from a day that a month add would constrain is the one case that does, so
|
|
1060
|
+
* it takes the spec path and everything else stays the polyfill's own call.
|
|
1061
|
+
*
|
|
1062
|
+
* @param one the earlier plain datetime
|
|
1063
|
+
* @param two the later plain datetime
|
|
1064
|
+
* @param options Temporal difference options, passed through unchanged when the defect cannot apply
|
|
1065
|
+
* @returns the difference; throws where TC39 Temporal throws
|
|
1066
|
+
*/
|
|
1067
|
+
export function plainUntilWithRounding(one, two, options = {}) {
|
|
1068
|
+
const settings = roundingSettings(options.largestUnit, options.smallestUnit, (smallestUnit) => largerUnit("hour", smallestUnit), options.roundingIncrement, options.roundingMode ?? "trunc");
|
|
1069
|
+
if (settings !== null &&
|
|
1070
|
+
isNudgeWindowUnit(settings.smallestUnit) &&
|
|
1071
|
+
one.day >= 29 &&
|
|
1072
|
+
one.calendarId === two.calendarId &&
|
|
1073
|
+
Temporal.PlainDateTime.compare(one, two) <= 0 &&
|
|
1074
|
+
isNudgeWindowCompatNeeded() &&
|
|
1075
|
+
optionsAreValid(() => PLAIN_DATE_TIME_PROBE.until(PLAIN_DATE_TIME_PROBE, options))) {
|
|
1076
|
+
const rounded = differencePlainDateTimeWithRounding(one, two, one.calendarId, settings);
|
|
1077
|
+
return temporalDurationFromInternal(rounded, isDateUnit(settings.largestUnit)
|
|
1078
|
+
? "hour"
|
|
1079
|
+
: settings.largestUnit);
|
|
1080
|
+
}
|
|
1081
|
+
return one.until(two, options);
|
|
1082
|
+
}
|
|
1083
|
+
/**
|
|
1084
|
+
* `Duration#total({ unit, relativeTo })`, correct at the range limits and in calendars the
|
|
1085
|
+
* polyfill gets wrong.
|
|
1086
|
+
*
|
|
1087
|
+
* @param duration the duration to total
|
|
1088
|
+
* @param unit the Temporal unit to total in
|
|
1089
|
+
* @param relativeTo Temporal `relativeTo`; a zoned one reaches the range-limit fallbacks, and a
|
|
1090
|
+
* zoned or plain one in a calendar that needs the compat layer takes the spec path
|
|
1091
|
+
* @returns the total; throws where TC39 Temporal throws
|
|
1092
|
+
*/
|
|
1093
|
+
export function durationTotal(duration, unit, relativeTo) {
|
|
1094
|
+
const zoned = zonedRelativeTo(relativeTo);
|
|
1095
|
+
const resolvedUnit = toUnit(unit);
|
|
1096
|
+
const bySpec = resolvedUnit === null
|
|
1097
|
+
? null
|
|
1098
|
+
: calendarTotalBySpec(duration, unit, resolvedUnit, relativeTo, zoned);
|
|
1099
|
+
if (bySpec !== null) {
|
|
1100
|
+
return bySpec;
|
|
1101
|
+
}
|
|
1102
|
+
// Defect 4: the polyfill's month fraction, when the day can be constrained.
|
|
1103
|
+
const byMonthSpec = resolvedUnit === null
|
|
1104
|
+
? null
|
|
1105
|
+
: monthTotalBySpec(duration, unit, resolvedUnit, relativeTo, zoned);
|
|
1106
|
+
if (byMonthSpec !== null) {
|
|
1107
|
+
return byMonthSpec;
|
|
1108
|
+
}
|
|
1109
|
+
if (zoned === null) {
|
|
1110
|
+
return duration.total({ unit, relativeTo });
|
|
1111
|
+
}
|
|
1112
|
+
const atRangeLimit = resolvedUnit !== null &&
|
|
1113
|
+
reachesRangeLimit([zoned.epochNanoseconds], durationReach(duration) + UNIT_REACH[resolvedUnit]);
|
|
1114
|
+
return runAtRangeLimit(zoned.timeZoneId, atRangeLimit, (timeZone) => duration.total({ unit, relativeTo: inTimeZone(zoned, timeZone) }), () => totalAtLimit(duration, zoned, unit, resolvedUnit));
|
|
1115
|
+
}
|
|
1116
|
+
/**
|
|
1117
|
+
* `Duration#round(roundTo)`, correct at the range limits.
|
|
1118
|
+
*
|
|
1119
|
+
* @param duration the duration to round
|
|
1120
|
+
* @param roundTo Temporal round options; only a zoned `relativeTo` reaches the fallbacks
|
|
1121
|
+
* @returns the rounded duration; throws where TC39 Temporal throws
|
|
1122
|
+
*/
|
|
1123
|
+
export function durationRound(duration, roundTo) {
|
|
1124
|
+
const zoned = zonedRelativeTo(roundTo.relativeTo);
|
|
1125
|
+
const settings = roundingSettings(roundTo.largestUnit, roundTo.smallestUnit, (smallestUnit) => largerUnit(defaultLargestUnit(duration), smallestUnit), roundTo.roundingIncrement, roundTo.roundingMode ?? "halfExpand");
|
|
1126
|
+
const bySpec = settings === null
|
|
1127
|
+
? null
|
|
1128
|
+
: calendarRoundBySpec(duration, roundTo, settings, zoned);
|
|
1129
|
+
if (bySpec !== null) {
|
|
1130
|
+
return bySpec;
|
|
1131
|
+
}
|
|
1132
|
+
// Defect 4: the polyfill's nudge window, when the day can be constrained.
|
|
1133
|
+
const byNudgeSpec = settings === null
|
|
1134
|
+
? null
|
|
1135
|
+
: monthRoundBySpec(duration, roundTo, settings, zoned);
|
|
1136
|
+
if (byNudgeSpec !== null) {
|
|
1137
|
+
return byNudgeSpec;
|
|
1138
|
+
}
|
|
1139
|
+
if (zoned === null) {
|
|
1140
|
+
return duration.round(roundTo);
|
|
1141
|
+
}
|
|
1142
|
+
const atRangeLimit = settings !== null &&
|
|
1143
|
+
reachesRangeLimit([zoned.epochNanoseconds], durationReach(duration) + roundingReach(settings));
|
|
1144
|
+
return runAtRangeLimit(zoned.timeZoneId, atRangeLimit, (timeZone) => duration.round({
|
|
1145
|
+
...roundTo,
|
|
1146
|
+
relativeTo: inTimeZone(zoned, timeZone),
|
|
1147
|
+
}), () => roundAtLimit(duration, zoned, roundTo, settings));
|
|
1148
|
+
}
|
|
1149
|
+
/**
|
|
1150
|
+
* `Temporal.Duration.compare(one, two, { relativeTo })`, correct at the range limits.
|
|
1151
|
+
*
|
|
1152
|
+
* @param one the first duration
|
|
1153
|
+
* @param two the second duration
|
|
1154
|
+
* @param relativeTo Temporal `relativeTo`; only a zoned one reaches the fallbacks
|
|
1155
|
+
* @returns -1, 0 or 1; throws where TC39 Temporal throws
|
|
1156
|
+
*/
|
|
1157
|
+
export function durationCompare(one, two, relativeTo) {
|
|
1158
|
+
const zoned = zonedRelativeTo(relativeTo);
|
|
1159
|
+
const bySpec = calendarCompareBySpec(one, two, relativeTo, zoned);
|
|
1160
|
+
if (bySpec !== null) {
|
|
1161
|
+
return bySpec;
|
|
1162
|
+
}
|
|
1163
|
+
if (zoned === null) {
|
|
1164
|
+
return Temporal.Duration.compare(one, two, { relativeTo });
|
|
1165
|
+
}
|
|
1166
|
+
const first = Temporal.Duration.from(one);
|
|
1167
|
+
const second = Temporal.Duration.from(two);
|
|
1168
|
+
const reach = durationReach(first) > durationReach(second)
|
|
1169
|
+
? durationReach(first)
|
|
1170
|
+
: durationReach(second);
|
|
1171
|
+
return runAtRangeLimit(zoned.timeZoneId, reachesRangeLimit([zoned.epochNanoseconds], reach), (timeZone) => Temporal.Duration.compare(first, second, {
|
|
1172
|
+
relativeTo: inTimeZone(zoned, timeZone),
|
|
1173
|
+
}), () => compareAtLimit(first, second, zoned));
|
|
1174
|
+
}
|