@northguild/gmt 1.17.0 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (638) hide show
  1. package/README.md +462 -22
  2. package/dist/calendar/calculate/bucketRange.d.ts +3 -3
  3. package/dist/calendar/calculate/bucketRange.js +6 -6
  4. package/dist/calendar/calculate/floorToZone.d.ts +5 -3
  5. package/dist/calendar/calculate/floorToZone.js +6 -5
  6. package/dist/calendar/calculate/getFiscalPeriod.d.ts +21 -8
  7. package/dist/calendar/calculate/getFiscalPeriod.js +9 -8
  8. package/dist/calendar/calculate/getIsoWeekDate.d.ts +10 -5
  9. package/dist/calendar/calculate/getIsoWeekDate.js +1 -5
  10. package/dist/calendar/calculate/getOrdinalDate.d.ts +10 -3
  11. package/dist/calendar/calculate/getOrdinalDate.js +2 -3
  12. package/dist/calendar/calculate/getQuarter.d.ts +21 -9
  13. package/dist/calendar/calculate/getQuarter.js +8 -12
  14. package/dist/calendar/hours/addOperatingTime.d.ts +53 -0
  15. package/dist/calendar/hours/addOperatingTime.js +59 -0
  16. package/dist/calendar/hours/index.d.ts +7 -0
  17. package/dist/calendar/hours/index.js +7 -0
  18. package/dist/calendar/hours/isOpenAt.d.ts +39 -0
  19. package/dist/calendar/hours/isOpenAt.js +44 -0
  20. package/dist/calendar/hours/nextCloseAt.d.ts +49 -0
  21. package/dist/calendar/hours/nextCloseAt.js +51 -0
  22. package/dist/calendar/hours/nextOpenAt.d.ts +45 -0
  23. package/dist/calendar/hours/nextOpenAt.js +47 -0
  24. package/dist/calendar/hours/operatingIntervals.d.ts +43 -0
  25. package/dist/calendar/hours/operatingIntervals.js +52 -0
  26. package/dist/calendar/hours/operatingTimeBetween.d.ts +40 -0
  27. package/dist/calendar/hours/operatingTimeBetween.js +49 -0
  28. package/dist/calendar/hours/recurringWindows.d.ts +61 -0
  29. package/dist/calendar/hours/recurringWindows.js +80 -0
  30. package/dist/calendar/index.d.ts +1 -0
  31. package/dist/calendar/index.js +1 -0
  32. package/dist/duration/calculate/durationAs.d.ts +13 -8
  33. package/dist/duration/calculate/durationAs.js +4 -8
  34. package/dist/duration/compare/compareDurations.d.ts +12 -6
  35. package/dist/duration/compare/compareDurations.js +3 -6
  36. package/dist/duration/format/formatDuration.d.ts +16 -4
  37. package/dist/duration/format/formatDuration.js +4 -5
  38. package/dist/duration/normalize/normalizeDuration.d.ts +39 -14
  39. package/dist/duration/normalize/normalizeDuration.js +6 -15
  40. package/dist/duration/parse/parseDuration.d.ts +21 -3
  41. package/dist/duration/parse/parseDuration.js +1 -3
  42. package/dist/instant/convert/classifyLocal.d.ts +1 -1
  43. package/dist/instant/convert/classifyLocal.js +1 -1
  44. package/dist/instant/convert/fromOffsetInstant.d.ts +3 -1
  45. package/dist/instant/convert/fromOffsetInstant.js +3 -1
  46. package/dist/instant/convert/resolveLocal.d.ts +12 -7
  47. package/dist/instant/convert/resolveLocal.js +6 -10
  48. package/dist/instant/convert/toOffsetInstant.d.ts +22 -9
  49. package/dist/instant/convert/toOffsetInstant.js +10 -3
  50. package/dist/intermodal/calculate/billingTimeline.d.ts +31 -11
  51. package/dist/intermodal/calculate/billingTimeline.js +2 -2
  52. package/dist/intermodal/calculate/chargeableDays.d.ts +13 -11
  53. package/dist/intermodal/calculate/chargeableDays.js +4 -9
  54. package/dist/intermodal/calculate/demurrageClock.d.ts +16 -7
  55. package/dist/intermodal/calculate/demurrageClock.js +7 -7
  56. package/dist/intermodal/calculate/freeTimeExpiry.d.ts +5 -4
  57. package/dist/intermodal/calculate/freeTimeExpiry.js +6 -6
  58. package/dist/internal/businessCalendar.d.ts +5 -0
  59. package/dist/internal/businessCalendar.js +5 -1
  60. package/dist/internal/cycleFieldValue.d.ts +6 -4
  61. package/dist/internal/cycleFieldValue.js +6 -4
  62. package/dist/internal/daylightTime.d.ts +33 -0
  63. package/dist/internal/daylightTime.js +164 -0
  64. package/dist/internal/durationUntilString.js +4 -3
  65. package/dist/internal/englishCalendarNames.js +1 -2
  66. package/dist/internal/epochNanoseconds.d.ts +2 -0
  67. package/dist/internal/epochNanoseconds.js +2 -0
  68. package/dist/internal/exactDuration.d.ts +37 -0
  69. package/dist/internal/exactDuration.js +64 -0
  70. package/dist/internal/exactMoment.d.ts +72 -0
  71. package/dist/internal/exactMoment.js +114 -0
  72. package/dist/internal/fiscalCalendar.d.ts +4 -3
  73. package/dist/internal/fiscalCalendar.js +4 -3
  74. package/dist/internal/formatCalendarDays.d.ts +2 -2
  75. package/dist/internal/formatRelativeDuration.d.ts +21 -1
  76. package/dist/internal/formatRelativeDuration.js +47 -7
  77. package/dist/internal/index.d.ts +9 -4
  78. package/dist/internal/index.js +9 -4
  79. package/dist/internal/instantFormatOptions.js +2 -1
  80. package/dist/internal/instantNanoseconds.d.ts +75 -9
  81. package/dist/internal/instantNanoseconds.js +192 -11
  82. package/dist/internal/joinDateTimeConnector.d.ts +1 -1
  83. package/dist/internal/monthGridWeekRow.d.ts +2 -1
  84. package/dist/internal/monthGridWeekRow.js +2 -1
  85. package/dist/internal/normalizeTimeZone.d.ts +2 -2
  86. package/dist/internal/normalizeTimeZone.js +2 -2
  87. package/dist/internal/operatingSchedule.d.ts +129 -0
  88. package/dist/internal/operatingSchedule.js +668 -0
  89. package/dist/internal/optionOrDefault.d.ts +18 -0
  90. package/dist/internal/optionOrDefault.js +20 -0
  91. package/dist/internal/patternToken.d.ts +2 -2
  92. package/dist/internal/patternToken.js +28 -13
  93. package/dist/internal/plainDateUntil.js +10 -6
  94. package/dist/internal/punctuality.d.ts +38 -0
  95. package/dist/internal/punctuality.js +59 -0
  96. package/dist/internal/readDateTimeFormatOptions.d.ts +30 -0
  97. package/dist/internal/readDateTimeFormatOptions.js +93 -0
  98. package/dist/internal/resolveDurationRelativeTo.d.ts +4 -0
  99. package/dist/internal/resolveDurationRelativeTo.js +11 -1
  100. package/dist/internal/resolveRelativeRounding.d.ts +17 -6
  101. package/dist/internal/resolveRelativeRounding.js +27 -7
  102. package/dist/internal/resolveRelativeUnit.d.ts +30 -0
  103. package/dist/internal/resolveRelativeUnit.js +40 -0
  104. package/dist/internal/splitStep.d.ts +24 -1
  105. package/dist/internal/splitStep.js +34 -2
  106. package/dist/internal/startOrEndOfZoned.js +2 -3
  107. package/dist/internal/temporalCompat/capabilities.d.ts +26 -0
  108. package/dist/internal/temporalCompat/capabilities.js +35 -3
  109. package/dist/internal/temporalCompat/fieldSearch.js +1 -1
  110. package/dist/internal/temporalCompat/index.d.ts +1 -1
  111. package/dist/internal/temporalCompat/index.js +1 -1
  112. package/dist/internal/temporalCompat/repros.d.ts +1 -1
  113. package/dist/internal/temporalCompat/repros.js +157 -0
  114. package/dist/internal/timestampEvents.d.ts +32 -0
  115. package/dist/internal/timestampEvents.js +76 -0
  116. package/dist/internal/utcZonedDateTime.d.ts +5 -2
  117. package/dist/internal/utcZonedDateTime.js +8 -5
  118. package/dist/internal/zonedBucket.js +8 -6
  119. package/dist/internal/zonedLocalDates.js +1 -1
  120. package/dist/internal/zonedTransitionSearch.d.ts +27 -0
  121. package/dist/internal/zonedTransitionSearch.js +218 -0
  122. package/dist/internal/zonedWallClock.d.ts +21 -7
  123. package/dist/internal/zonedWallClock.js +87 -18
  124. package/dist/internal/zonedWallClockOperations.d.ts +26 -13
  125. package/dist/internal/zonedWallClockOperations.js +87 -34
  126. package/dist/interval/validate/isValidInterval.d.ts +6 -3
  127. package/dist/interval/validate/isValidInterval.js +6 -3
  128. package/dist/plain/calculate/addDate.d.ts +11 -8
  129. package/dist/plain/calculate/addDate.js +5 -8
  130. package/dist/plain/calculate/addDateTime.d.ts +7 -4
  131. package/dist/plain/calculate/addDateTime.js +1 -4
  132. package/dist/plain/calculate/cycleDate.d.ts +16 -7
  133. package/dist/plain/calculate/cycleDate.js +3 -7
  134. package/dist/plain/calculate/cycleDateTime.d.ts +14 -4
  135. package/dist/plain/calculate/cycleDateTime.js +1 -4
  136. package/dist/plain/calculate/cycleTime.d.ts +10 -5
  137. package/dist/plain/calculate/cycleTime.js +3 -5
  138. package/dist/plain/calculate/diffDate.d.ts +1 -1
  139. package/dist/plain/calculate/diffDate.js +1 -1
  140. package/dist/plain/calculate/diffDateAsDuration.d.ts +1 -1
  141. package/dist/plain/calculate/diffDateAsDuration.js +1 -1
  142. package/dist/plain/calculate/diffDateTime.d.ts +1 -1
  143. package/dist/plain/calculate/diffDateTime.js +1 -1
  144. package/dist/plain/calculate/diffDateTimeAsDuration.d.ts +1 -1
  145. package/dist/plain/calculate/diffDateTimeAsDuration.js +1 -1
  146. package/dist/plain/calculate/diffTime.d.ts +1 -1
  147. package/dist/plain/calculate/diffTime.js +1 -1
  148. package/dist/plain/calculate/endOfDate.d.ts +8 -3
  149. package/dist/plain/calculate/endOfDate.js +1 -3
  150. package/dist/plain/calculate/endOfDateTime.d.ts +15 -5
  151. package/dist/plain/calculate/endOfDateTime.js +1 -5
  152. package/dist/plain/calculate/endOfTime.d.ts +8 -2
  153. package/dist/plain/calculate/endOfTime.js +1 -2
  154. package/dist/plain/calculate/getLocaleWeekYear.d.ts +16 -9
  155. package/dist/plain/calculate/getLocaleWeekYear.js +9 -9
  156. package/dist/plain/calculate/getWeekOfMonth.d.ts +7 -4
  157. package/dist/plain/calculate/getWeekOfMonth.js +7 -4
  158. package/dist/plain/calculate/getWeeksInLocaleWeekYear.d.ts +13 -6
  159. package/dist/plain/calculate/getWeeksInLocaleWeekYear.js +6 -6
  160. package/dist/plain/calculate/getWeeksInMonth.d.ts +5 -2
  161. package/dist/plain/calculate/getWeeksInMonth.js +5 -2
  162. package/dist/plain/calculate/nextWeekday.d.ts +7 -3
  163. package/dist/plain/calculate/nextWeekday.js +1 -3
  164. package/dist/plain/calculate/previousWeekday.d.ts +7 -3
  165. package/dist/plain/calculate/previousWeekday.js +1 -3
  166. package/dist/plain/calculate/roundDate.d.ts +20 -7
  167. package/dist/plain/calculate/roundDate.js +3 -10
  168. package/dist/plain/calculate/roundDateTime.d.ts +22 -8
  169. package/dist/plain/calculate/roundDateTime.js +3 -11
  170. package/dist/plain/calculate/roundTime.d.ts +20 -4
  171. package/dist/plain/calculate/roundTime.js +3 -7
  172. package/dist/plain/calculate/setDate.d.ts +7 -5
  173. package/dist/plain/calculate/setDate.js +1 -5
  174. package/dist/plain/calculate/setDateTime.d.ts +8 -5
  175. package/dist/plain/calculate/setDateTime.js +1 -5
  176. package/dist/plain/calculate/setTime.d.ts +10 -6
  177. package/dist/plain/calculate/setTime.js +4 -6
  178. package/dist/plain/calculate/startOfDate.d.ts +8 -2
  179. package/dist/plain/calculate/startOfDate.js +1 -2
  180. package/dist/plain/calculate/startOfDateTime.d.ts +15 -2
  181. package/dist/plain/calculate/startOfDateTime.js +1 -2
  182. package/dist/plain/calculate/startOfTime.d.ts +8 -1
  183. package/dist/plain/calculate/startOfTime.js +1 -1
  184. package/dist/plain/calculate/subtractDate.d.ts +7 -4
  185. package/dist/plain/calculate/subtractDate.js +1 -4
  186. package/dist/plain/calculate/subtractDateTime.d.ts +7 -4
  187. package/dist/plain/calculate/subtractDateTime.js +1 -4
  188. package/dist/plain/compare/areDateTimesEqualBy.d.ts +13 -5
  189. package/dist/plain/compare/areDateTimesEqualBy.js +6 -5
  190. package/dist/plain/compare/areDatesEqualBy.d.ts +15 -6
  191. package/dist/plain/compare/areDatesEqualBy.js +8 -6
  192. package/dist/plain/compare/isBetweenDate.d.ts +13 -2
  193. package/dist/plain/compare/isBetweenDate.js +4 -4
  194. package/dist/plain/compare/isBetweenDateTime.d.ts +13 -2
  195. package/dist/plain/compare/isBetweenDateTime.js +4 -4
  196. package/dist/plain/compare/isBetweenTime.d.ts +13 -2
  197. package/dist/plain/compare/isBetweenTime.js +4 -4
  198. package/dist/plain/compare/isRelativeDay.d.ts +1 -1
  199. package/dist/plain/compare/isRelativeDay.js +1 -1
  200. package/dist/plain/compare/isThisUnit.d.ts +1 -1
  201. package/dist/plain/compare/isThisUnit.js +1 -1
  202. package/dist/plain/format/formatCalendar.d.ts +21 -14
  203. package/dist/plain/format/formatCalendar.js +21 -16
  204. package/dist/plain/format/formatDate.js +5 -3
  205. package/dist/plain/format/formatDateRange.js +4 -2
  206. package/dist/plain/format/formatDateTime.js +4 -2
  207. package/dist/plain/format/formatDateTimeRange.js +4 -2
  208. package/dist/plain/format/formatDateTimeToParts.d.ts +15 -4
  209. package/dist/plain/format/formatDateTimeToParts.js +10 -6
  210. package/dist/plain/format/formatDateToParts.d.ts +13 -2
  211. package/dist/plain/format/formatDateToParts.js +8 -4
  212. package/dist/plain/format/formatRelativeDate.d.ts +16 -3
  213. package/dist/plain/format/formatRelativeDate.js +26 -15
  214. package/dist/plain/format/formatRelativeDateTime.d.ts +16 -3
  215. package/dist/plain/format/formatRelativeDateTime.js +8 -5
  216. package/dist/plain/format/formatRelativeTime.d.ts +16 -3
  217. package/dist/plain/format/formatRelativeTime.js +21 -13
  218. package/dist/plain/format/formatTime.js +4 -2
  219. package/dist/plain/interval/intervalDifferenceDate.d.ts +9 -0
  220. package/dist/plain/interval/intervalDifferenceDateTime.d.ts +9 -0
  221. package/dist/plain/interval/intervalDifferenceTime.d.ts +9 -0
  222. package/dist/plain/interval/intervalDivideEquallyDate.d.ts +19 -4
  223. package/dist/plain/interval/intervalDivideEquallyDate.js +3 -4
  224. package/dist/plain/interval/intervalDivideEquallyDateTime.d.ts +19 -4
  225. package/dist/plain/interval/intervalDivideEquallyDateTime.js +3 -4
  226. package/dist/plain/interval/intervalDivideEquallyTime.d.ts +19 -4
  227. package/dist/plain/interval/intervalDivideEquallyTime.js +3 -4
  228. package/dist/plain/interval/intervalFromDurationDate.d.ts +16 -3
  229. package/dist/plain/interval/intervalFromDurationDate.js +1 -3
  230. package/dist/plain/interval/intervalFromDurationDateTime.d.ts +16 -3
  231. package/dist/plain/interval/intervalFromDurationDateTime.js +1 -3
  232. package/dist/plain/interval/intervalFromDurationTime.d.ts +9 -0
  233. package/dist/plain/interval/intervalIntersectionDate.d.ts +9 -0
  234. package/dist/plain/interval/intervalIntersectionDateTime.d.ts +9 -0
  235. package/dist/plain/interval/intervalIntersectionTime.d.ts +9 -0
  236. package/dist/plain/interval/intervalSplitAtDate.d.ts +11 -0
  237. package/dist/plain/interval/intervalSplitAtDate.js +2 -0
  238. package/dist/plain/interval/intervalSplitAtDateTime.d.ts +11 -0
  239. package/dist/plain/interval/intervalSplitAtDateTime.js +2 -0
  240. package/dist/plain/interval/intervalSplitAtTime.d.ts +11 -0
  241. package/dist/plain/interval/intervalSplitAtTime.js +2 -0
  242. package/dist/plain/interval/intervalUnionDate.d.ts +9 -0
  243. package/dist/plain/interval/intervalUnionDateTime.d.ts +9 -0
  244. package/dist/plain/interval/intervalUnionTime.d.ts +9 -0
  245. package/dist/plain/interval/intervalXorAllDate.d.ts +9 -0
  246. package/dist/plain/interval/intervalXorAllDateTime.d.ts +9 -0
  247. package/dist/plain/interval/intervalXorAllTime.d.ts +9 -0
  248. package/dist/plain/interval/intervalXorDate.d.ts +9 -0
  249. package/dist/plain/interval/intervalXorDateTime.d.ts +9 -0
  250. package/dist/plain/interval/intervalXorTime.d.ts +9 -0
  251. package/dist/plain/interval/mergeIntervalsDate.d.ts +9 -0
  252. package/dist/plain/interval/mergeIntervalsDateTime.d.ts +9 -0
  253. package/dist/plain/interval/mergeIntervalsTime.d.ts +9 -0
  254. package/dist/plain/interval/splitIntervalByUnitDate.d.ts +23 -7
  255. package/dist/plain/interval/splitIntervalByUnitDate.js +7 -7
  256. package/dist/plain/interval/splitIntervalByUnitDateTime.d.ts +22 -6
  257. package/dist/plain/interval/splitIntervalByUnitDateTime.js +6 -6
  258. package/dist/plain/interval/splitIntervalByUnitTime.d.ts +17 -4
  259. package/dist/plain/interval/splitIntervalByUnitTime.js +1 -4
  260. package/dist/plain/map/mapDatesInRange.d.ts +8 -4
  261. package/dist/plain/map/mapDatesInRange.js +1 -4
  262. package/dist/plain/parse/parseDateTimeWithPattern.d.ts +10 -7
  263. package/dist/plain/parse/parseDateTimeWithPattern.js +10 -7
  264. package/dist/plain/parse/parseDateWithPattern.d.ts +10 -7
  265. package/dist/plain/parse/parseDateWithPattern.js +10 -7
  266. package/dist/plain/parse/parseTimeWithPattern.d.ts +10 -7
  267. package/dist/plain/parse/parseTimeWithPattern.js +10 -7
  268. package/dist/plain/parse/parseUnitFromDate.d.ts +11 -3
  269. package/dist/plain/parse/parseUnitFromDate.js +3 -3
  270. package/dist/plain/parse/parseUnitFromDateTime.d.ts +11 -3
  271. package/dist/plain/parse/parseUnitFromDateTime.js +3 -3
  272. package/dist/plain/parse/parseWeekFromDate.d.ts +10 -6
  273. package/dist/plain/parse/parseWeekFromDate.js +2 -6
  274. package/dist/plain/parse/parseWeekFromDateTime.d.ts +10 -6
  275. package/dist/plain/parse/parseWeekFromDateTime.js +2 -6
  276. package/dist/plain/validate/isValidDateRange.d.ts +19 -4
  277. package/dist/plain/validate/isValidDateRange.js +1 -4
  278. package/dist/plain/validate/isValidDateTimeRange.d.ts +20 -5
  279. package/dist/plain/validate/isValidDateTimeRange.js +2 -5
  280. package/dist/plain/validate/isValidTimeRange.d.ts +20 -5
  281. package/dist/plain/validate/isValidTimeRange.js +2 -5
  282. package/dist/precision/convert/fromExcelSerial.d.ts +10 -4
  283. package/dist/precision/convert/fromExcelSerial.js +4 -5
  284. package/dist/precision/convert/fromNanoseconds.d.ts +1 -1
  285. package/dist/precision/convert/fromNanoseconds.js +1 -1
  286. package/dist/precision/convert/toExcelSerial.d.ts +9 -3
  287. package/dist/precision/convert/toExcelSerial.js +3 -4
  288. package/dist/precision/convert/toNanoseconds.d.ts +11 -6
  289. package/dist/precision/convert/toNanoseconds.js +11 -6
  290. package/dist/precision/validate/isValidInstant.d.ts +12 -3
  291. package/dist/precision/validate/isValidInstant.js +12 -3
  292. package/dist/span/calculate/spanMs.d.ts +10 -4
  293. package/dist/span/calculate/spanMs.js +10 -4
  294. package/dist/span/calculate/spanNs.d.ts +10 -4
  295. package/dist/span/calculate/spanNs.js +10 -4
  296. package/dist/span/validate/isValidSpan.d.ts +8 -3
  297. package/dist/span/validate/isValidSpan.js +8 -3
  298. package/dist/transport/calculate/bestAvailable.d.ts +47 -0
  299. package/dist/transport/calculate/bestAvailable.js +76 -0
  300. package/dist/transport/calculate/crossingTime.d.ts +58 -0
  301. package/dist/transport/calculate/crossingTime.js +76 -0
  302. package/dist/transport/calculate/cutoffAt.d.ts +90 -0
  303. package/dist/transport/calculate/cutoffAt.js +209 -0
  304. package/dist/transport/calculate/cutoffSchedule.d.ts +70 -0
  305. package/dist/transport/calculate/cutoffSchedule.js +71 -0
  306. package/dist/transport/calculate/dwellTime.d.ts +16 -7
  307. package/dist/transport/calculate/dwellTime.js +12 -8
  308. package/dist/transport/calculate/estimateDrift.d.ts +65 -0
  309. package/dist/transport/calculate/estimateDrift.js +75 -0
  310. package/dist/transport/calculate/index.d.ts +8 -0
  311. package/dist/transport/calculate/index.js +8 -0
  312. package/dist/transport/calculate/nextDeparture.d.ts +78 -0
  313. package/dist/transport/calculate/nextDeparture.js +131 -0
  314. package/dist/transport/calculate/punctualityRate.d.ts +42 -0
  315. package/dist/transport/calculate/punctualityRate.js +59 -0
  316. package/dist/transport/calculate/scheduleDelivery.d.ts +150 -0
  317. package/dist/transport/calculate/scheduleDelivery.js +300 -0
  318. package/dist/transport/calculate/transitTime.d.ts +21 -3
  319. package/dist/transport/calculate/transitTime.js +29 -46
  320. package/dist/transport/compare/classifyPunctuality.d.ts +46 -0
  321. package/dist/transport/compare/classifyPunctuality.js +64 -0
  322. package/dist/transport/compare/index.d.ts +4 -0
  323. package/dist/transport/compare/index.js +4 -0
  324. package/dist/transport/compare/isPastCutoff.d.ts +33 -0
  325. package/dist/transport/compare/isPastCutoff.js +48 -0
  326. package/dist/transport/compare/scheduleDeviation.d.ts +37 -0
  327. package/dist/transport/compare/scheduleDeviation.js +53 -0
  328. package/dist/transport/compare/timeToCutoff.d.ts +31 -0
  329. package/dist/transport/compare/timeToCutoff.js +47 -0
  330. package/dist/transport/convert/etaAtZone.d.ts +7 -0
  331. package/dist/transport/convert/etaAtZone.js +9 -4
  332. package/dist/transport/index.d.ts +1 -0
  333. package/dist/transport/index.js +1 -0
  334. package/dist/types/business-calendar.d.ts +19 -14
  335. package/dist/types/calendar-options.d.ts +15 -3
  336. package/dist/types/date-cycle-field.d.ts +5 -0
  337. package/dist/types/date-duration-unit.d.ts +4 -0
  338. package/dist/types/date-time-cycle-field.d.ts +4 -0
  339. package/dist/types/date-time-duration-units.d.ts +4 -0
  340. package/dist/types/date-time-unit.d.ts +4 -0
  341. package/dist/types/date-unit.d.ts +4 -0
  342. package/dist/types/disambiguation.d.ts +8 -0
  343. package/dist/types/duration-relative-to.d.ts +8 -0
  344. package/dist/types/duration-string-options.d.ts +28 -0
  345. package/dist/types/fiscal-calendar.d.ts +1 -1
  346. package/dist/types/fractional-digit.d.ts +5 -0
  347. package/dist/types/free-time-options.d.ts +21 -11
  348. package/dist/types/index.d.ts +2 -1
  349. package/dist/types/index.js +2 -1
  350. package/dist/types/interval.d.ts +8 -1
  351. package/dist/types/offset.d.ts +9 -0
  352. package/dist/types/operating-schedule.d.ts +71 -0
  353. package/dist/types/overflow.d.ts +6 -0
  354. package/dist/types/relative-rounding-method.d.ts +6 -0
  355. package/dist/types/relative-time-options.d.ts +33 -5
  356. package/dist/types/rounding-options.d.ts +27 -0
  357. package/dist/types/time-cycle-field.d.ts +4 -0
  358. package/dist/types/time-duration-unit.d.ts +4 -0
  359. package/dist/types/time-unit.d.ts +4 -0
  360. package/dist/types/transport-timestamps.d.ts +54 -0
  361. package/dist/types/transport-timestamps.js +0 -0
  362. package/dist/unix/calculate/addUnix.d.ts +19 -5
  363. package/dist/unix/calculate/addUnix.js +1 -5
  364. package/dist/unix/calculate/diffUnix.d.ts +13 -3
  365. package/dist/unix/calculate/diffUnix.js +1 -3
  366. package/dist/unix/calculate/diffUnixAsDuration.d.ts +13 -3
  367. package/dist/unix/calculate/diffUnixAsDuration.js +1 -3
  368. package/dist/unix/calculate/endOfQuarterForUnix.d.ts +13 -3
  369. package/dist/unix/calculate/endOfQuarterForUnix.js +1 -3
  370. package/dist/unix/calculate/endOfUnix.d.ts +20 -4
  371. package/dist/unix/calculate/endOfUnix.js +1 -4
  372. package/dist/unix/calculate/isBetweenUnix.d.ts +26 -4
  373. package/dist/unix/calculate/isBetweenUnix.js +4 -6
  374. package/dist/unix/calculate/roundUnix.d.ts +31 -3
  375. package/dist/unix/calculate/roundUnix.js +3 -6
  376. package/dist/unix/calculate/setUnix.d.ts +35 -9
  377. package/dist/unix/calculate/setUnix.js +4 -13
  378. package/dist/unix/calculate/startOfQuarterForUnix.d.ts +13 -3
  379. package/dist/unix/calculate/startOfQuarterForUnix.js +1 -3
  380. package/dist/unix/calculate/startOfUnix.d.ts +20 -4
  381. package/dist/unix/calculate/startOfUnix.js +1 -4
  382. package/dist/unix/calculate/subtractUnix.d.ts +19 -5
  383. package/dist/unix/calculate/subtractUnix.js +1 -5
  384. package/dist/unix/compare/areUnixEqual.d.ts +7 -1
  385. package/dist/unix/compare/areUnixEqual.js +1 -1
  386. package/dist/unix/compare/areUnixEqualBy.d.ts +24 -7
  387. package/dist/unix/compare/areUnixEqualBy.js +13 -9
  388. package/dist/unix/compare/isAfterUnix.d.ts +7 -1
  389. package/dist/unix/compare/isAfterUnix.js +1 -1
  390. package/dist/unix/compare/isBeforeUnix.d.ts +7 -1
  391. package/dist/unix/compare/isBeforeUnix.js +1 -1
  392. package/dist/unix/convert/convertUnixToPlainDate.d.ts +14 -4
  393. package/dist/unix/convert/convertUnixToPlainDate.js +2 -4
  394. package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +14 -4
  395. package/dist/unix/convert/convertUnixToPlainDateTime.js +2 -4
  396. package/dist/unix/convert/convertUnixToPlainTime.d.ts +14 -4
  397. package/dist/unix/convert/convertUnixToPlainTime.js +2 -4
  398. package/dist/unix/convert/convertUnixToUtc.d.ts +9 -4
  399. package/dist/unix/convert/convertUnixToUtc.js +3 -4
  400. package/dist/unix/convert/convertUnixToZoned.d.ts +10 -5
  401. package/dist/unix/convert/convertUnixToZoned.js +4 -5
  402. package/dist/unix/format/formatCalendarUnix.d.ts +27 -19
  403. package/dist/unix/format/formatCalendarUnix.js +4 -5
  404. package/dist/unix/format/formatRelativeUnix.d.ts +54 -5
  405. package/dist/unix/format/formatRelativeUnix.js +3 -5
  406. package/dist/unix/format/formatUnix.d.ts +24 -6
  407. package/dist/unix/format/formatUnix.js +8 -7
  408. package/dist/unix/get/getUnixNow.d.ts +8 -3
  409. package/dist/unix/get/getUnixNow.js +1 -3
  410. package/dist/unix/interval/intervalCountUnix.d.ts +14 -5
  411. package/dist/unix/interval/intervalCountUnix.js +2 -5
  412. package/dist/unix/interval/intervalDifferenceUnix.d.ts +6 -0
  413. package/dist/unix/interval/intervalDivideEquallyUnix.d.ts +18 -4
  414. package/dist/unix/interval/intervalDivideEquallyUnix.js +5 -4
  415. package/dist/unix/interval/intervalFromDurationUnix.d.ts +33 -5
  416. package/dist/unix/interval/intervalFromDurationUnix.js +6 -5
  417. package/dist/unix/interval/intervalIntersectionUnix.d.ts +6 -0
  418. package/dist/unix/interval/intervalLengthUnix.d.ts +16 -6
  419. package/dist/unix/interval/intervalLengthUnix.js +4 -6
  420. package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +13 -3
  421. package/dist/unix/interval/intervalOverlappingDaysUnix.js +1 -3
  422. package/dist/unix/interval/intervalSplitAtUnix.d.ts +8 -0
  423. package/dist/unix/interval/intervalSplitAtUnix.js +2 -0
  424. package/dist/unix/interval/intervalUnionUnix.d.ts +6 -0
  425. package/dist/unix/interval/intervalXorAllUnix.d.ts +6 -0
  426. package/dist/unix/interval/intervalXorUnix.d.ts +6 -0
  427. package/dist/unix/interval/mergeIntervalsUnix.d.ts +6 -0
  428. package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +42 -11
  429. package/dist/unix/interval/splitIntervalByUnitUnix.js +21 -16
  430. package/dist/unix/parse/parseDateFromUnix.d.ts +13 -2
  431. package/dist/unix/parse/parseDateFromUnix.js +1 -2
  432. package/dist/unix/parse/parseDayFromUnix.d.ts +14 -2
  433. package/dist/unix/parse/parseDayFromUnix.js +2 -2
  434. package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +13 -1
  435. package/dist/unix/parse/parseDayOfWeekFromUnix.js +1 -1
  436. package/dist/unix/parse/parseHourFromUnix.d.ts +14 -2
  437. package/dist/unix/parse/parseHourFromUnix.js +2 -2
  438. package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +14 -2
  439. package/dist/unix/parse/parseMicrosecondFromUnix.js +2 -2
  440. package/dist/unix/parse/parseMillisecondFromUnix.d.ts +14 -2
  441. package/dist/unix/parse/parseMillisecondFromUnix.js +2 -2
  442. package/dist/unix/parse/parseMinuteFromUnix.d.ts +14 -2
  443. package/dist/unix/parse/parseMinuteFromUnix.js +2 -2
  444. package/dist/unix/parse/parseMonthFromUnix.d.ts +14 -2
  445. package/dist/unix/parse/parseMonthFromUnix.js +2 -2
  446. package/dist/unix/parse/parseNanosecondFromUnix.d.ts +14 -2
  447. package/dist/unix/parse/parseNanosecondFromUnix.js +2 -2
  448. package/dist/unix/parse/parseSecondFromUnix.d.ts +14 -2
  449. package/dist/unix/parse/parseSecondFromUnix.js +2 -2
  450. package/dist/unix/parse/parseTimeFromUnix.d.ts +13 -2
  451. package/dist/unix/parse/parseTimeFromUnix.js +1 -2
  452. package/dist/unix/parse/parseUnitFromUnix.d.ts +22 -3
  453. package/dist/unix/parse/parseUnitFromUnix.js +2 -3
  454. package/dist/unix/parse/parseWeekFromUnix.d.ts +23 -7
  455. package/dist/unix/parse/parseWeekFromUnix.js +3 -7
  456. package/dist/unix/parse/parseYearFromUnix.d.ts +14 -2
  457. package/dist/unix/parse/parseYearFromUnix.js +2 -2
  458. package/dist/unix/validate/isValidUnixRange.d.ts +20 -4
  459. package/dist/unix/validate/isValidUnixRange.js +1 -4
  460. package/dist/utc/calculate/addUtc.d.ts +7 -4
  461. package/dist/utc/calculate/addUtc.js +1 -4
  462. package/dist/utc/calculate/diffUtc.d.ts +1 -1
  463. package/dist/utc/calculate/diffUtc.js +1 -1
  464. package/dist/utc/calculate/diffUtcAsDuration.d.ts +1 -1
  465. package/dist/utc/calculate/diffUtcAsDuration.js +1 -1
  466. package/dist/utc/calculate/endOfUtc.d.ts +16 -3
  467. package/dist/utc/calculate/endOfUtc.js +2 -3
  468. package/dist/utc/calculate/isBetweenUtc.d.ts +13 -2
  469. package/dist/utc/calculate/isBetweenUtc.js +4 -4
  470. package/dist/utc/calculate/roundUtc.d.ts +26 -9
  471. package/dist/utc/calculate/roundUtc.js +3 -12
  472. package/dist/utc/calculate/setUtc.d.ts +7 -4
  473. package/dist/utc/calculate/setUtc.js +1 -4
  474. package/dist/utc/calculate/startOfUtc.d.ts +15 -2
  475. package/dist/utc/calculate/startOfUtc.js +1 -2
  476. package/dist/utc/calculate/subtractUtc.d.ts +7 -4
  477. package/dist/utc/calculate/subtractUtc.js +1 -4
  478. package/dist/utc/compare/areUtcEqualBy.d.ts +9 -3
  479. package/dist/utc/compare/areUtcEqualBy.js +2 -3
  480. package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -3
  481. package/dist/utc/convert/convertUtcToPlainDate.js +5 -6
  482. package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +8 -3
  483. package/dist/utc/convert/convertUtcToPlainDateTime.js +5 -6
  484. package/dist/utc/convert/convertUtcToPlainTime.d.ts +8 -3
  485. package/dist/utc/convert/convertUtcToPlainTime.js +5 -6
  486. package/dist/utc/convert/convertUtcToUnix.d.ts +9 -4
  487. package/dist/utc/convert/convertUtcToUnix.js +3 -4
  488. package/dist/utc/convert/convertUtcToZoned.d.ts +1 -1
  489. package/dist/utc/convert/convertUtcToZoned.js +1 -1
  490. package/dist/utc/format/formatCalendarUtc.d.ts +19 -8
  491. package/dist/utc/format/formatCalendarUtc.js +8 -6
  492. package/dist/utc/format/formatHttp.d.ts +1 -1
  493. package/dist/utc/format/formatHttp.js +1 -1
  494. package/dist/utc/format/formatRelativeUtc.d.ts +30 -10
  495. package/dist/utc/format/formatRelativeUtc.js +9 -11
  496. package/dist/utc/format/formatUtc.d.ts +17 -15
  497. package/dist/utc/format/formatUtc.js +8 -8
  498. package/dist/utc/interval/intervalDifferenceUtc.d.ts +6 -0
  499. package/dist/utc/interval/intervalDivideEquallyUtc.d.ts +18 -4
  500. package/dist/utc/interval/intervalDivideEquallyUtc.js +5 -4
  501. package/dist/utc/interval/intervalFromDurationUtc.d.ts +13 -3
  502. package/dist/utc/interval/intervalFromDurationUtc.js +1 -3
  503. package/dist/utc/interval/intervalIntersectionUtc.d.ts +6 -0
  504. package/dist/utc/interval/intervalSplitAtUtc.d.ts +8 -0
  505. package/dist/utc/interval/intervalSplitAtUtc.js +2 -0
  506. package/dist/utc/interval/intervalUnionUtc.d.ts +6 -0
  507. package/dist/utc/interval/intervalXorAllUtc.d.ts +6 -0
  508. package/dist/utc/interval/intervalXorUtc.d.ts +6 -0
  509. package/dist/utc/interval/mergeIntervalsUtc.d.ts +6 -0
  510. package/dist/utc/interval/splitIntervalByUnitUtc.d.ts +19 -6
  511. package/dist/utc/interval/splitIntervalByUnitUtc.js +6 -6
  512. package/dist/utc/parse/parseDateFromUtc.d.ts +7 -3
  513. package/dist/utc/parse/parseDateFromUtc.js +1 -3
  514. package/dist/utc/parse/parseDayFromUtc.d.ts +7 -3
  515. package/dist/utc/parse/parseDayFromUtc.js +1 -3
  516. package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +7 -3
  517. package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -6
  518. package/dist/utc/parse/parseHourFromUtc.d.ts +7 -3
  519. package/dist/utc/parse/parseHourFromUtc.js +1 -3
  520. package/dist/utc/parse/parseHttp.d.ts +1 -1
  521. package/dist/utc/parse/parseHttp.js +1 -1
  522. package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +7 -3
  523. package/dist/utc/parse/parseMicrosecondFromUtc.js +1 -3
  524. package/dist/utc/parse/parseMillisecondFromUtc.d.ts +7 -3
  525. package/dist/utc/parse/parseMillisecondFromUtc.js +1 -3
  526. package/dist/utc/parse/parseMinuteFromUtc.d.ts +7 -3
  527. package/dist/utc/parse/parseMinuteFromUtc.js +1 -3
  528. package/dist/utc/parse/parseMonthFromUtc.d.ts +7 -3
  529. package/dist/utc/parse/parseMonthFromUtc.js +1 -3
  530. package/dist/utc/parse/parseNanosecondFromUtc.d.ts +7 -3
  531. package/dist/utc/parse/parseNanosecondFromUtc.js +1 -3
  532. package/dist/utc/parse/parseSecondFromUtc.d.ts +7 -3
  533. package/dist/utc/parse/parseSecondFromUtc.js +1 -3
  534. package/dist/utc/parse/parseTimeFromUtc.d.ts +8 -3
  535. package/dist/utc/parse/parseTimeFromUtc.js +5 -6
  536. package/dist/utc/parse/parseUnitFromUtc.d.ts +17 -5
  537. package/dist/utc/parse/parseUnitFromUtc.js +6 -8
  538. package/dist/utc/parse/parseWeekFromUtc.d.ts +18 -10
  539. package/dist/utc/parse/parseWeekFromUtc.js +7 -13
  540. package/dist/utc/parse/parseYearFromUtc.d.ts +7 -3
  541. package/dist/utc/parse/parseYearFromUtc.js +1 -3
  542. package/dist/utc/validate/isValidUtcRange.d.ts +16 -5
  543. package/dist/utc/validate/isValidUtcRange.js +2 -5
  544. package/dist/zoned/calculate/addZoned.d.ts +20 -10
  545. package/dist/zoned/calculate/addZoned.js +6 -13
  546. package/dist/zoned/calculate/cycleZoned.d.ts +33 -8
  547. package/dist/zoned/calculate/cycleZoned.js +1 -8
  548. package/dist/zoned/calculate/diffZoned.d.ts +1 -1
  549. package/dist/zoned/calculate/diffZoned.js +1 -1
  550. package/dist/zoned/calculate/diffZonedAsDuration.d.ts +1 -1
  551. package/dist/zoned/calculate/diffZonedAsDuration.js +1 -1
  552. package/dist/zoned/calculate/endOfQuarterForZoned.d.ts +9 -2
  553. package/dist/zoned/calculate/endOfQuarterForZoned.js +4 -5
  554. package/dist/zoned/calculate/endOfZoned.d.ts +16 -3
  555. package/dist/zoned/calculate/endOfZoned.js +2 -3
  556. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.d.ts +10 -3
  557. package/dist/zoned/calculate/getLocaleZonedEndOfWeek.js +5 -6
  558. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.d.ts +7 -1
  559. package/dist/zoned/calculate/getLocaleZonedStartOfWeek.js +3 -4
  560. package/dist/zoned/calculate/roundZoned.d.ts +21 -4
  561. package/dist/zoned/calculate/roundZoned.js +3 -7
  562. package/dist/zoned/calculate/setZoned.d.ts +25 -8
  563. package/dist/zoned/calculate/setZoned.js +4 -12
  564. package/dist/zoned/calculate/startOfQuarterForZoned.d.ts +7 -2
  565. package/dist/zoned/calculate/startOfQuarterForZoned.js +3 -5
  566. package/dist/zoned/calculate/startOfZoned.d.ts +15 -3
  567. package/dist/zoned/calculate/startOfZoned.js +1 -3
  568. package/dist/zoned/calculate/subtractZoned.d.ts +20 -10
  569. package/dist/zoned/calculate/subtractZoned.js +6 -13
  570. package/dist/zoned/compare/areZonedEqualBy.d.ts +14 -5
  571. package/dist/zoned/compare/areZonedEqualBy.js +7 -5
  572. package/dist/zoned/compare/isBetweenZoned.d.ts +13 -1
  573. package/dist/zoned/compare/isBetweenZoned.js +4 -3
  574. package/dist/zoned/compare/isInDaylightSaving.d.ts +38 -11
  575. package/dist/zoned/compare/isInDaylightSaving.js +40 -44
  576. package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +18 -5
  577. package/dist/zoned/convert/convertPlainDateTimeToZoned.js +6 -11
  578. package/dist/zoned/convert/convertZonedToUnix.d.ts +9 -4
  579. package/dist/zoned/convert/convertZonedToUnix.js +2 -4
  580. package/dist/zoned/convert/convertZonedToZoned.d.ts +1 -1
  581. package/dist/zoned/convert/convertZonedToZoned.js +1 -1
  582. package/dist/zoned/format/formatCalendarZoned.d.ts +18 -12
  583. package/dist/zoned/format/formatCalendarZoned.js +13 -9
  584. package/dist/zoned/format/formatRelativeZoned.d.ts +41 -12
  585. package/dist/zoned/format/formatRelativeZoned.js +7 -4
  586. package/dist/zoned/format/formatRfc2822.d.ts +2 -2
  587. package/dist/zoned/format/formatRfc2822.js +2 -2
  588. package/dist/zoned/format/formatRfc3339.d.ts +2 -3
  589. package/dist/zoned/format/formatRfc3339.js +2 -3
  590. package/dist/zoned/format/formatTimeZoneName.d.ts +12 -3
  591. package/dist/zoned/format/formatTimeZoneName.js +5 -4
  592. package/dist/zoned/format/formatZonedDateTime.js +2 -1
  593. package/dist/zoned/format/formatZonedRange.js +2 -1
  594. package/dist/zoned/format/formatZonedToParts.d.ts +15 -4
  595. package/dist/zoned/format/formatZonedToParts.js +8 -5
  596. package/dist/zoned/get/getDstTransitions.d.ts +9 -10
  597. package/dist/zoned/get/getDstTransitions.js +12 -3
  598. package/dist/zoned/get/getTimeZoneOffset.d.ts +4 -1
  599. package/dist/zoned/get/getTimeZoneOffset.js +6 -3
  600. package/dist/zoned/get/getZonedNow.d.ts +13 -1
  601. package/dist/zoned/get/getZonedNow.js +12 -3
  602. package/dist/zoned/interval/intervalDifferenceZoned.d.ts +9 -0
  603. package/dist/zoned/interval/intervalDivideEquallyZoned.d.ts +22 -4
  604. package/dist/zoned/interval/intervalDivideEquallyZoned.js +6 -4
  605. package/dist/zoned/interval/intervalFromDurationZoned.d.ts +29 -10
  606. package/dist/zoned/interval/intervalFromDurationZoned.js +6 -13
  607. package/dist/zoned/interval/intervalIntersectionZoned.d.ts +9 -0
  608. package/dist/zoned/interval/intervalSplitAtZoned.d.ts +11 -0
  609. package/dist/zoned/interval/intervalSplitAtZoned.js +2 -0
  610. package/dist/zoned/interval/intervalUnionZoned.d.ts +9 -0
  611. package/dist/zoned/interval/intervalXorAllZoned.d.ts +9 -0
  612. package/dist/zoned/interval/intervalXorZoned.d.ts +9 -0
  613. package/dist/zoned/interval/mergeIntervalsZoned.d.ts +9 -0
  614. package/dist/zoned/interval/splitIntervalByUnitZoned.d.ts +27 -6
  615. package/dist/zoned/interval/splitIntervalByUnitZoned.js +11 -6
  616. package/dist/zoned/map/mapZonedDatesInRange.d.ts +9 -4
  617. package/dist/zoned/map/mapZonedDatesInRange.js +2 -4
  618. package/dist/zoned/parse/parseRfc2822.d.ts +1 -1
  619. package/dist/zoned/parse/parseRfc2822.js +1 -1
  620. package/dist/zoned/parse/parseUnitFromZoned.d.ts +9 -3
  621. package/dist/zoned/parse/parseUnitFromZoned.js +1 -3
  622. package/dist/zoned/parse/parseWeekFromZoned.d.ts +10 -3
  623. package/dist/zoned/parse/parseWeekFromZoned.js +2 -3
  624. package/dist/zoned/validate/hasDaylightSaving.d.ts +42 -11
  625. package/dist/zoned/validate/hasDaylightSaving.js +47 -31
  626. package/dist/zoned/validate/isValidZonedDateTime.d.ts +13 -0
  627. package/dist/zoned/validate/isValidZonedDateTime.js +14 -1
  628. package/dist/zoned/validate/isValidZonedRange.d.ts +15 -4
  629. package/dist/zoned/validate/isValidZonedRange.js +1 -4
  630. package/package.json +18 -5
  631. package/skills/gmt-arithmetic/SKILL.md +1 -1
  632. package/skills/gmt-basics/SKILL.md +10 -1
  633. package/skills/gmt-integration/SKILL.md +10 -5
  634. package/skills/gmt-timezone/SKILL.md +150 -21
  635. package/dist/internal/resolveReadingTimeZone.d.ts +0 -11
  636. package/dist/internal/resolveReadingTimeZone.js +0 -18
  637. package/dist/types/duration-unit.d.ts +0 -5
  638. /package/dist/types/{duration-unit.js → operating-schedule.js} +0 -0
@@ -16,9 +16,14 @@
16
16
  * required, optionally followed by a bracketed IANA zone — a bracket alone is not enough,
17
17
  * which is the one string shape `spanWallClock` accepts and these two do not. The
18
18
  * endpoints need not share a zone; an instant is an instant.
19
- * - **A bracketed zone annotation is syntactic only.** As in `Temporal.Instant.from`, it is
20
- * ignored: each offset alone fixes its instant, and a zone that does not exist or disagrees
21
- * with the offset is not checked. `spanWallClock`, by contrast, rejects a mismatched offset.
19
+ * - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
20
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
21
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
22
+ * `Temporal.ZonedDateTime.from` reads it, so a zoned string Temporal wrote is read back as
23
+ * the instant it was written for, except a wall time repeated inside a sub-minute offset
24
+ * change, which reads as its first pass (see `isValidInstant`). Otherwise the bracket is not
25
+ * checked: a zone that does not exist, or that disagrees with the offset, changes nothing. `spanWallClock`, by
26
+ * contrast, rejects a mismatched offset.
22
27
  * - Returns `null` on invalid input, not `0` — `0` is the span between an instant and itself.
23
28
  * `null`, not `NaN`, because that is GMT's sentinel for every number-returning function:
24
29
  * it is the one a caller already checks for, and the only one `strictNullChecks` forces
@@ -45,7 +50,8 @@
45
50
  * @example spanMs("2024-03-10T12:00:00Z", "2024-03-10T12:00:00Z") // 0
46
51
  * @example spanMs("2024-03-10T12:00:00Z", "2024-03-10T12:00:00.123456789Z") // 123.456789
47
52
  * @example spanMs("2024-03-09T12:00:00-05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 82800000 — 23 hours, not 24
48
- * @example spanMs("2024-03-10T12:00:00+05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 32400000 — offsets decide, the zone is ignored
53
+ * @example spanMs("2024-03-10T12:00:00+05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 32400000 — offsets decide, the zone is not checked
54
+ * @example spanMs("1960-01-01T01:04:30Z", "1960-01-01T00:20:00-00:45[Africa/Monrovia]") // 0 — the zone's −00:44:30, which `-00:45` rounds
49
55
  * @example spanMs("-271821-04-20T00:00:00Z", "+275760-09-13T00:00:00Z") // null — past the safe integer range, use spanNs
50
56
  * @example spanMs("2024-03-10T12:00:00Z", "invalid") // null
51
57
  */
@@ -28,9 +28,14 @@ const MAX_SAFE_NANOSECONDS = BigInt(Number.MAX_SAFE_INTEGER) * NANOSECONDS_PER_M
28
28
  * required, optionally followed by a bracketed IANA zone — a bracket alone is not enough,
29
29
  * which is the one string shape `spanWallClock` accepts and these two do not. The
30
30
  * endpoints need not share a zone; an instant is an instant.
31
- * - **A bracketed zone annotation is syntactic only.** As in `Temporal.Instant.from`, it is
32
- * ignored: each offset alone fixes its instant, and a zone that does not exist or disagrees
33
- * with the offset is not checked. `spanWallClock`, by contrast, rejects a mismatched offset.
31
+ * - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
32
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
33
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
34
+ * `Temporal.ZonedDateTime.from` reads it, so a zoned string Temporal wrote is read back as
35
+ * the instant it was written for, except a wall time repeated inside a sub-minute offset
36
+ * change, which reads as its first pass (see `isValidInstant`). Otherwise the bracket is not
37
+ * checked: a zone that does not exist, or that disagrees with the offset, changes nothing. `spanWallClock`, by
38
+ * contrast, rejects a mismatched offset.
34
39
  * - Returns `null` on invalid input, not `0` — `0` is the span between an instant and itself.
35
40
  * `null`, not `NaN`, because that is GMT's sentinel for every number-returning function:
36
41
  * it is the one a caller already checks for, and the only one `strictNullChecks` forces
@@ -57,7 +62,8 @@ const MAX_SAFE_NANOSECONDS = BigInt(Number.MAX_SAFE_INTEGER) * NANOSECONDS_PER_M
57
62
  * @example spanMs("2024-03-10T12:00:00Z", "2024-03-10T12:00:00Z") // 0
58
63
  * @example spanMs("2024-03-10T12:00:00Z", "2024-03-10T12:00:00.123456789Z") // 123.456789
59
64
  * @example spanMs("2024-03-09T12:00:00-05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 82800000 — 23 hours, not 24
60
- * @example spanMs("2024-03-10T12:00:00+05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 32400000 — offsets decide, the zone is ignored
65
+ * @example spanMs("2024-03-10T12:00:00+05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 32400000 — offsets decide, the zone is not checked
66
+ * @example spanMs("1960-01-01T01:04:30Z", "1960-01-01T00:20:00-00:45[Africa/Monrovia]") // 0 — the zone's −00:44:30, which `-00:45` rounds
61
67
  * @example spanMs("-271821-04-20T00:00:00Z", "+275760-09-13T00:00:00Z") // null — past the safe integer range, use spanNs
62
68
  * @example spanMs("2024-03-10T12:00:00Z", "invalid") // null
63
69
  */
@@ -14,9 +14,14 @@
14
14
  * required, optionally followed by a bracketed IANA zone — a bracket alone is not enough,
15
15
  * which is the one string shape `spanWallClock` accepts and these two do not. The
16
16
  * endpoints need not share a zone; an instant is an instant.
17
- * - **A bracketed zone annotation is syntactic only.** As in `Temporal.Instant.from`, it is
18
- * ignored: each offset alone fixes its instant, and a zone that does not exist or disagrees
19
- * with the offset is not checked. `spanWallClock`, by contrast, rejects a mismatched offset.
17
+ * - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
18
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
19
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
20
+ * `Temporal.ZonedDateTime.from` reads it, so a zoned string Temporal wrote is read back as
21
+ * the instant it was written for, except a wall time repeated inside a sub-minute offset
22
+ * change, which reads as its first pass (see `isValidInstant`). Otherwise the bracket is not
23
+ * checked: a zone that does not exist, or that disagrees with the offset, changes nothing. `spanWallClock`, by
24
+ * contrast, rejects a mismatched offset.
20
25
  * - Returns `null` on invalid input, not `0n` — `0n` is the span between an instant and
21
26
  * itself. This is why it does not simply subtract two `toNanoseconds` results, which
22
27
  * return `0n` for both the epoch and a rejected string.
@@ -37,7 +42,8 @@
37
42
  * @example spanNs("2024-03-10T12:00:00Z", "2024-03-10T12:00:00Z") // 0n
38
43
  * @example spanNs("2024-03-10T12:00:00.123456789Z", "2024-03-10T12:00:00.123456790Z") // 1n
39
44
  * @example spanNs("2024-03-10T07:00:00-05:00[America/New_York]", "2024-03-10T12:00:00Z") // 0n — same instant, different zones
40
- * @example spanNs("2024-03-10T12:00:00+05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 32400000000000n — offsets decide, the zone is ignored
45
+ * @example spanNs("2024-03-10T12:00:00+05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 32400000000000n — offsets decide, the zone is not checked
46
+ * @example spanNs("1960-01-01T01:04:30Z", "1960-01-01T00:20:00-00:45[Africa/Monrovia]") // 0n — the zone's −00:44:30, which `-00:45` rounds
41
47
  * @example spanNs("2024-03-10T12:00:00Z", "invalid") // null
42
48
  */
43
49
  export declare function spanNs(start: string, end: string): bigint | null;
@@ -15,9 +15,14 @@ import { parseInstantNanoseconds } from "../../internal/index.js";
15
15
  * required, optionally followed by a bracketed IANA zone — a bracket alone is not enough,
16
16
  * which is the one string shape `spanWallClock` accepts and these two do not. The
17
17
  * endpoints need not share a zone; an instant is an instant.
18
- * - **A bracketed zone annotation is syntactic only.** As in `Temporal.Instant.from`, it is
19
- * ignored: each offset alone fixes its instant, and a zone that does not exist or disagrees
20
- * with the offset is not checked. `spanWallClock`, by contrast, rejects a mismatched offset.
18
+ * - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
19
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
20
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
21
+ * `Temporal.ZonedDateTime.from` reads it, so a zoned string Temporal wrote is read back as
22
+ * the instant it was written for, except a wall time repeated inside a sub-minute offset
23
+ * change, which reads as its first pass (see `isValidInstant`). Otherwise the bracket is not
24
+ * checked: a zone that does not exist, or that disagrees with the offset, changes nothing. `spanWallClock`, by
25
+ * contrast, rejects a mismatched offset.
21
26
  * - Returns `null` on invalid input, not `0n` — `0n` is the span between an instant and
22
27
  * itself. This is why it does not simply subtract two `toNanoseconds` results, which
23
28
  * return `0n` for both the epoch and a rejected string.
@@ -38,7 +43,8 @@ import { parseInstantNanoseconds } from "../../internal/index.js";
38
43
  * @example spanNs("2024-03-10T12:00:00Z", "2024-03-10T12:00:00Z") // 0n
39
44
  * @example spanNs("2024-03-10T12:00:00.123456789Z", "2024-03-10T12:00:00.123456790Z") // 1n
40
45
  * @example spanNs("2024-03-10T07:00:00-05:00[America/New_York]", "2024-03-10T12:00:00Z") // 0n — same instant, different zones
41
- * @example spanNs("2024-03-10T12:00:00+05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 32400000000000n — offsets decide, the zone is ignored
46
+ * @example spanNs("2024-03-10T12:00:00+05:00[America/New_York]", "2024-03-10T12:00:00-04:00[America/New_York]") // 32400000000000n — offsets decide, the zone is not checked
47
+ * @example spanNs("1960-01-01T01:04:30Z", "1960-01-01T00:20:00-00:45[Africa/Monrovia]") // 0n — the zone's −00:44:30, which `-00:45` rounds
42
48
  * @example spanNs("2024-03-10T12:00:00Z", "invalid") // null
43
49
  */
44
50
  export function spanNs(start, end) {
@@ -8,9 +8,14 @@
8
8
  * optionally followed by a bracketed IANA zone; no leap seconds. Calendar and elective
9
9
  * annotations are ignored, as `Temporal.Instant.from` ignores them. The two endpoints need not
10
10
  * share a zone.
11
- * - **A bracketed zone annotation is syntactic only.** As in `Temporal.Instant.from`, it is
12
- * ignored: each offset alone fixes its instant, and a zone that does not exist or disagrees
13
- * with the offset is not checked.
11
+ * - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
12
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
13
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
14
+ * `Temporal.ZonedDateTime.from` reads it, so a zoned string Temporal wrote is read back as
15
+ * the instant it was written for, except a wall time repeated inside a sub-minute offset
16
+ * change, which reads as its first pass (see `isValidInstant`). Otherwise the bracket is not
17
+ * checked: a zone that does not exist, or that disagrees with the offset, changes nothing. Validity never depends
18
+ * on the bracket.
14
19
  * - Order does not matter. A span is signed, not invalid, when `start` is after `end`, so
15
20
  * this is symmetric.
16
21
  * - **`spanMs` can still return `null` on a pair this accepts** — a span wider than
@@ -9,9 +9,14 @@ import { parseInstantNanoseconds } from "../../internal/index.js";
9
9
  * optionally followed by a bracketed IANA zone; no leap seconds. Calendar and elective
10
10
  * annotations are ignored, as `Temporal.Instant.from` ignores them. The two endpoints need not
11
11
  * share a zone.
12
- * - **A bracketed zone annotation is syntactic only.** As in `Temporal.Instant.from`, it is
13
- * ignored: each offset alone fixes its instant, and a zone that does not exist or disagrees
14
- * with the offset is not checked.
12
+ * - **The offset fixes the instant; a bracketed zone only resolves a rounded one.** An offset
13
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
14
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
15
+ * `Temporal.ZonedDateTime.from` reads it, so a zoned string Temporal wrote is read back as
16
+ * the instant it was written for, except a wall time repeated inside a sub-minute offset
17
+ * change, which reads as its first pass (see `isValidInstant`). Otherwise the bracket is not
18
+ * checked: a zone that does not exist, or that disagrees with the offset, changes nothing. Validity never depends
19
+ * on the bracket.
15
20
  * - Order does not matter. A span is signed, not invalid, when `start` is after `end`, so
16
21
  * this is symmetric.
17
22
  * - **`spanMs` can still return `null` on a pair this accepts** — a span wider than
@@ -0,0 +1,47 @@
1
+ import type { TimestampClass, TimestampEvent } from "../../types/index.js";
2
+ /** What `bestAvailable` returns: the chosen timestamp and the class it carries. */
3
+ export interface ClassifiedTimestamp {
4
+ /** The chosen event's `at`, exactly as it was written. */
5
+ at: string;
6
+ /** The class of the chosen event, so the value is never shown as something it is not. */
7
+ classifier: TimestampClass;
8
+ }
9
+ /**
10
+ * Pick the best available timestamp for an event from its planned, estimated, requested and
11
+ * actual records, and say which class it is.
12
+ *
13
+ * One field often carries four meanings — DCSA's `eventClassifierCode` vocabulary: `PLN`
14
+ * (planned), `EST` (estimated), `REQ` (requested) and `ACT` (actual). A dashboard that shows the
15
+ * latest-recorded value puts an estimate in the actual column the moment a late feed arrives.
16
+ * This returns the class with the value, so the consumer can label it.
17
+ *
18
+ * - **An `ACT` wins whenever there is one**, whatever was recorded after it: an estimate recorded
19
+ * after the arrival is still only an estimate.
20
+ * - Otherwise `PLN`, then `REQ`, then `EST`. This `ACT` > `PLN` > `REQ` > `EST` selection is GMT's
21
+ * own convention. DCSA's Port Call standard negotiates some port call services — a berth,
22
+ * pilotage, towage — through an estimated, then requested, then planned timestamp, followed by
23
+ * an actual; this order reads that pattern from its most settled end. DCSA defines the classes
24
+ * and the pattern, not a rule for choosing among them. A plan is agreed; a request is asked
25
+ * for; an estimate is only predicted. So an `EST` or `REQ` never replaces a `PLN`, however much later it was recorded,
26
+ * and there is never an `EST` when a `REQ` exists. The order is fixed, not configurable.
27
+ * - Within the chosen class, the newest-recorded event wins (latest `recordedAt`), so a revised
28
+ * plan or a corrected actual replaces the earlier one. Two records at the same instant go to
29
+ * the later one in the array.
30
+ * - `at` is echoed exactly as written. `at` and `recordedAt` are instants (`Z`/offset) or zoned
31
+ * strings, compared as instants and read as `scheduleDeviation` reads them: the offset fixes
32
+ * the instant, and an offset written to the minute that is the bracketed zone's sub-minute
33
+ * offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives.
34
+ * Otherwise the bracket is not checked.
35
+ * - Returns `null` for an empty list, or when any event is invalid — a `classifier` other than
36
+ * exactly `PLN`, `EST`, `REQ` or `ACT` included.
37
+ *
38
+ * @param events the event's timestamp records, in any order
39
+ * @returns the chosen `at` and its class (null for an empty list), or null on invalid input
40
+ *
41
+ * @example bestAvailable([{ classifier: "ACT", at: "2024-06-15T12:52:00Z", recordedAt: "2024-06-15T12:53:00Z" }, { classifier: "EST", at: "2024-06-15T13:05:00Z", recordedAt: "2024-06-15T14:00:00Z" }]) // { at: "2024-06-15T12:52:00Z", classifier: "ACT" } (an estimate recorded after the actual never replaces it)
42
+ * @example bestAvailable([{ classifier: "PLN", at: "2024-06-15T12:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }, { classifier: "PLN", at: "2024-06-15T13:00:00Z", recordedAt: "2024-06-10T00:00:00Z" }]) // { at: "2024-06-15T13:00:00Z", classifier: "PLN" } (the newest plan)
43
+ * @example bestAvailable([{ classifier: "EST", at: "2024-06-15T12:40:00Z", recordedAt: "2024-06-14T00:00:00Z" }, { classifier: "REQ", at: "2024-06-15T12:30:00Z", recordedAt: "2024-06-12T00:00:00Z" }]) // { at: "2024-06-15T12:30:00Z", classifier: "REQ" } (never an EST when a REQ exists)
44
+ * @example bestAvailable([]) // null
45
+ * @example bestAvailable([{ classifier: "ETA", at: "2024-06-15T12:40:00Z", recordedAt: "2024-06-14T00:00:00Z" }]) // null (not a timestamp class)
46
+ */
47
+ export declare function bestAvailable(events: TimestampEvent[]): ClassifiedTimestamp | null;
@@ -0,0 +1,76 @@
1
+ import { parseTimestampEvents } from "../../internal/index.js";
2
+ /**
3
+ * GMT's selection order: an actual, else a plan, else a request, else an estimate.
4
+ *
5
+ * GMT rule. DCSA defines the four classes (`eventClassifierCode`) and, in its Port Call
6
+ * standard, the pattern some port call services are negotiated through: "an (Estimated,
7
+ * Requested, Planned) ERP-pattern, including an (Actual) A" (DCSA Port Call 2.0.0, Use Cases,
8
+ * "Port Call Services Summary":
9
+ * https://reference.dcsa.org/content/standards/releases/port-call/v2-0-0/port-call-v2-0-0-use-cases).
10
+ * DCSA gives no rule for choosing among the classes; this order reads that pattern from its most
11
+ * settled end.
12
+ */
13
+ const PRECEDENCE = ["ACT", "PLN", "REQ", "EST"];
14
+ /**
15
+ * Pick the best available timestamp for an event from its planned, estimated, requested and
16
+ * actual records, and say which class it is.
17
+ *
18
+ * One field often carries four meanings — DCSA's `eventClassifierCode` vocabulary: `PLN`
19
+ * (planned), `EST` (estimated), `REQ` (requested) and `ACT` (actual). A dashboard that shows the
20
+ * latest-recorded value puts an estimate in the actual column the moment a late feed arrives.
21
+ * This returns the class with the value, so the consumer can label it.
22
+ *
23
+ * - **An `ACT` wins whenever there is one**, whatever was recorded after it: an estimate recorded
24
+ * after the arrival is still only an estimate.
25
+ * - Otherwise `PLN`, then `REQ`, then `EST`. This `ACT` > `PLN` > `REQ` > `EST` selection is GMT's
26
+ * own convention. DCSA's Port Call standard negotiates some port call services — a berth,
27
+ * pilotage, towage — through an estimated, then requested, then planned timestamp, followed by
28
+ * an actual; this order reads that pattern from its most settled end. DCSA defines the classes
29
+ * and the pattern, not a rule for choosing among them. A plan is agreed; a request is asked
30
+ * for; an estimate is only predicted. So an `EST` or `REQ` never replaces a `PLN`, however much later it was recorded,
31
+ * and there is never an `EST` when a `REQ` exists. The order is fixed, not configurable.
32
+ * - Within the chosen class, the newest-recorded event wins (latest `recordedAt`), so a revised
33
+ * plan or a corrected actual replaces the earlier one. Two records at the same instant go to
34
+ * the later one in the array.
35
+ * - `at` is echoed exactly as written. `at` and `recordedAt` are instants (`Z`/offset) or zoned
36
+ * strings, compared as instants and read as `scheduleDeviation` reads them: the offset fixes
37
+ * the instant, and an offset written to the minute that is the bracketed zone's sub-minute
38
+ * offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives.
39
+ * Otherwise the bracket is not checked.
40
+ * - Returns `null` for an empty list, or when any event is invalid — a `classifier` other than
41
+ * exactly `PLN`, `EST`, `REQ` or `ACT` included.
42
+ *
43
+ * @param events the event's timestamp records, in any order
44
+ * @returns the chosen `at` and its class (null for an empty list), or null on invalid input
45
+ *
46
+ * @example bestAvailable([{ classifier: "ACT", at: "2024-06-15T12:52:00Z", recordedAt: "2024-06-15T12:53:00Z" }, { classifier: "EST", at: "2024-06-15T13:05:00Z", recordedAt: "2024-06-15T14:00:00Z" }]) // { at: "2024-06-15T12:52:00Z", classifier: "ACT" } (an estimate recorded after the actual never replaces it)
47
+ * @example bestAvailable([{ classifier: "PLN", at: "2024-06-15T12:00:00Z", recordedAt: "2024-06-01T00:00:00Z" }, { classifier: "PLN", at: "2024-06-15T13:00:00Z", recordedAt: "2024-06-10T00:00:00Z" }]) // { at: "2024-06-15T13:00:00Z", classifier: "PLN" } (the newest plan)
48
+ * @example bestAvailable([{ classifier: "EST", at: "2024-06-15T12:40:00Z", recordedAt: "2024-06-14T00:00:00Z" }, { classifier: "REQ", at: "2024-06-15T12:30:00Z", recordedAt: "2024-06-12T00:00:00Z" }]) // { at: "2024-06-15T12:30:00Z", classifier: "REQ" } (never an EST when a REQ exists)
49
+ * @example bestAvailable([]) // null
50
+ * @example bestAvailable([{ classifier: "ETA", at: "2024-06-15T12:40:00Z", recordedAt: "2024-06-14T00:00:00Z" }]) // null (not a timestamp class)
51
+ */
52
+ export function bestAvailable(events) {
53
+ try {
54
+ const parsed = parseTimestampEvents(events);
55
+ if (parsed === null) {
56
+ return null;
57
+ }
58
+ // `parsed` is in recording order, so the last event of a class is its newest record.
59
+ const newest = new Map();
60
+ for (const event of parsed) {
61
+ newest.set(event.classifier, event.at);
62
+ }
63
+ for (const classifier of PRECEDENCE) {
64
+ const at = newest.get(classifier);
65
+ if (at !== undefined) {
66
+ return { at, classifier };
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ catch {
72
+ // Never throws (Core Rule 3): a hostile
73
+ // argument is invalid input, not an exception.
74
+ return null;
75
+ }
76
+ }
@@ -0,0 +1,58 @@
1
+ /** What `crossingTime` returns: exact elapsed time plus the local view at either end. */
2
+ export interface Crossing {
3
+ /**
4
+ * The exact elapsed time from entry to exit, as an ISO 8601 duration with hours as the largest
5
+ * unit.
6
+ */
7
+ duration: string;
8
+ /** The entry, rendered in the target zone. */
9
+ enter: string;
10
+ /** The exit, rendered in the target zone. */
11
+ exit: string;
12
+ }
13
+ /**
14
+ * Measure a crossing — a canal transit, a strait passage, a border queue — and render both ends
15
+ * in the zone the crossing is administered in.
16
+ *
17
+ * A crossing is logged as two instants, and the authority that schedules it reads both on its
18
+ * own clock. `crossingTime` returns the exact elapsed time between them plus the zone-local
19
+ * entry and exit. It deliberately counts no calendar days: dwell charged by local days
20
+ * (`calendarDays`) is `dwellTime`'s job, and a crossing that needs a day count is a dwell.
21
+ *
22
+ * - **`duration` is exact elapsed time.** A crossing spanning a DST transition reports the hours
23
+ * that actually elapsed; the local wall clocks at either end can be an hour apart from that.
24
+ * Hours is the largest unit, so the value never depends on a calendar.
25
+ * - **`targetZone` is always the rendering zone.** `entry` and `exit` are anything
26
+ * `isValidInstant` accepts — `Z`, an offset, or an offset with a bracketed zone — and only the
27
+ * instant is read: a bracketed zone in the input is never the zone the result is rendered
28
+ * in. That is the one contract difference from `dwellTime`, whose zone may come from its
29
+ * entry's bracket.
30
+ * - **The offset fixes each instant; a bracketed zone only resolves a rounded one.** An offset
31
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
32
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
33
+ * `Temporal.ZonedDateTime.from` reads it. A zone that does not exist, or that disagrees with
34
+ * the offset, is not checked and changes nothing.
35
+ * - `targetZone` is whatever `isValidTimeZone` accepts, which is what Temporal accepts: an IANA
36
+ * identifier, or a fixed offset such as `"+02:00"`, which observes no DST.
37
+ * - GMT does not resolve a canal, lock or checkpoint code to a zone; the caller supplies the
38
+ * identifier.
39
+ * - Returns `null` when either instant is invalid, when `exit` is before `entry` (an inverted
40
+ * crossing is a data error, not a negative transit), or when the zone is invalid. A zero-length
41
+ * crossing is `PT0S`.
42
+ *
43
+ * @param entry ISO 8601 zoned datetime or instant string of entering the crossing
44
+ * @param exit ISO 8601 zoned datetime or instant string of leaving it
45
+ * @param targetZone IANA timeZone identifier or fixed offset the crossing is read in
46
+ * @returns exact duration and zone-local entry and exit, or null on invalid input
47
+ *
48
+ * @example crossingTime("2024-06-15T08:00:00Z", "2024-06-15T17:30:00Z", "Europe/Berlin") // { duration: "PT9H30M", enter: "2024-06-15T10:00:00+02:00[Europe/Berlin]", exit: "2024-06-15T19:30:00+02:00[Europe/Berlin]" }
49
+ * @example crossingTime("2024-06-15T10:00:00+09:00", "2024-06-15T12:00:00+09:00", "Asia/Tokyo") // { duration: "PT2H", enter: "2024-06-15T10:00:00+09:00[Asia/Tokyo]", exit: "2024-06-15T12:00:00+09:00[Asia/Tokyo]" }
50
+ * @example crossingTime("2024-03-10T05:00:00Z", "2024-03-10T12:00:00Z", "America/New_York") // { duration: "PT7H", enter: "2024-03-10T00:00:00-05:00[America/New_York]", exit: "2024-03-10T08:00:00-04:00[America/New_York]" } (seven elapsed hours across the spring-forward)
51
+ * @example crossingTime("2024-11-03T05:30:00Z", "2024-11-03T06:30:00Z", "America/New_York") // { duration: "PT1H", enter: "2024-11-03T01:30:00-04:00[America/New_York]", exit: "2024-11-03T01:30:00-05:00[America/New_York]" } (both ends read 01:30; the offsets tell them apart)
52
+ * @example crossingTime("2024-06-15T10:00:00Z", "2024-06-15T10:00:00Z", "Asia/Tokyo") // { duration: "PT0S", enter: "2024-06-15T19:00:00+09:00[Asia/Tokyo]", exit: "2024-06-15T19:00:00+09:00[Asia/Tokyo]" }
53
+ * @example crossingTime("2024-06-15T22:30:00Z", "2024-06-16T01:00:00Z", "+02:00") // { duration: "PT2H30M", enter: "2024-06-16T00:30:00+02:00[+02:00]", exit: "2024-06-16T03:00:00+02:00[+02:00]" } (a fixed offset renders with no DST)
54
+ * @example crossingTime("2024-06-16T01:00:00Z", "2024-06-15T22:30:00Z", "Europe/London") // null (exit before entry)
55
+ * @example crossingTime("2024-06-15T22:30:00Z", "2024-06-16T01:00:00Z", "Europe/Londres") // null
56
+ * @example crossingTime("2024-06-15T22:30:00", "2024-06-16T01:00:00Z", "Europe/London") // null (no offset designator: not a moment)
57
+ */
58
+ export declare function crossingTime(entry: string, exit: string, targetZone: string): Crossing | null;
@@ -0,0 +1,76 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ import { instantFrom } from "../../internal/index.js";
3
+ import { isValidInstant } from "../../precision/validate/isValidInstant.js";
4
+ import { isValidTimeZone } from "../../zoned/validate/isValidTimeZone.js";
5
+ /**
6
+ * Measure a crossing — a canal transit, a strait passage, a border queue — and render both ends
7
+ * in the zone the crossing is administered in.
8
+ *
9
+ * A crossing is logged as two instants, and the authority that schedules it reads both on its
10
+ * own clock. `crossingTime` returns the exact elapsed time between them plus the zone-local
11
+ * entry and exit. It deliberately counts no calendar days: dwell charged by local days
12
+ * (`calendarDays`) is `dwellTime`'s job, and a crossing that needs a day count is a dwell.
13
+ *
14
+ * - **`duration` is exact elapsed time.** A crossing spanning a DST transition reports the hours
15
+ * that actually elapsed; the local wall clocks at either end can be an hour apart from that.
16
+ * Hours is the largest unit, so the value never depends on a calendar.
17
+ * - **`targetZone` is always the rendering zone.** `entry` and `exit` are anything
18
+ * `isValidInstant` accepts — `Z`, an offset, or an offset with a bracketed zone — and only the
19
+ * instant is read: a bracketed zone in the input is never the zone the result is rendered
20
+ * in. That is the one contract difference from `dwellTime`, whose zone may come from its
21
+ * entry's bracket.
22
+ * - **The offset fixes each instant; a bracketed zone only resolves a rounded one.** An offset
23
+ * written to the minute that is the bracketed zone's sub-minute offset rounded
24
+ * (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives, as
25
+ * `Temporal.ZonedDateTime.from` reads it. A zone that does not exist, or that disagrees with
26
+ * the offset, is not checked and changes nothing.
27
+ * - `targetZone` is whatever `isValidTimeZone` accepts, which is what Temporal accepts: an IANA
28
+ * identifier, or a fixed offset such as `"+02:00"`, which observes no DST.
29
+ * - GMT does not resolve a canal, lock or checkpoint code to a zone; the caller supplies the
30
+ * identifier.
31
+ * - Returns `null` when either instant is invalid, when `exit` is before `entry` (an inverted
32
+ * crossing is a data error, not a negative transit), or when the zone is invalid. A zero-length
33
+ * crossing is `PT0S`.
34
+ *
35
+ * @param entry ISO 8601 zoned datetime or instant string of entering the crossing
36
+ * @param exit ISO 8601 zoned datetime or instant string of leaving it
37
+ * @param targetZone IANA timeZone identifier or fixed offset the crossing is read in
38
+ * @returns exact duration and zone-local entry and exit, or null on invalid input
39
+ *
40
+ * @example crossingTime("2024-06-15T08:00:00Z", "2024-06-15T17:30:00Z", "Europe/Berlin") // { duration: "PT9H30M", enter: "2024-06-15T10:00:00+02:00[Europe/Berlin]", exit: "2024-06-15T19:30:00+02:00[Europe/Berlin]" }
41
+ * @example crossingTime("2024-06-15T10:00:00+09:00", "2024-06-15T12:00:00+09:00", "Asia/Tokyo") // { duration: "PT2H", enter: "2024-06-15T10:00:00+09:00[Asia/Tokyo]", exit: "2024-06-15T12:00:00+09:00[Asia/Tokyo]" }
42
+ * @example crossingTime("2024-03-10T05:00:00Z", "2024-03-10T12:00:00Z", "America/New_York") // { duration: "PT7H", enter: "2024-03-10T00:00:00-05:00[America/New_York]", exit: "2024-03-10T08:00:00-04:00[America/New_York]" } (seven elapsed hours across the spring-forward)
43
+ * @example crossingTime("2024-11-03T05:30:00Z", "2024-11-03T06:30:00Z", "America/New_York") // { duration: "PT1H", enter: "2024-11-03T01:30:00-04:00[America/New_York]", exit: "2024-11-03T01:30:00-05:00[America/New_York]" } (both ends read 01:30; the offsets tell them apart)
44
+ * @example crossingTime("2024-06-15T10:00:00Z", "2024-06-15T10:00:00Z", "Asia/Tokyo") // { duration: "PT0S", enter: "2024-06-15T19:00:00+09:00[Asia/Tokyo]", exit: "2024-06-15T19:00:00+09:00[Asia/Tokyo]" }
45
+ * @example crossingTime("2024-06-15T22:30:00Z", "2024-06-16T01:00:00Z", "+02:00") // { duration: "PT2H30M", enter: "2024-06-16T00:30:00+02:00[+02:00]", exit: "2024-06-16T03:00:00+02:00[+02:00]" } (a fixed offset renders with no DST)
46
+ * @example crossingTime("2024-06-16T01:00:00Z", "2024-06-15T22:30:00Z", "Europe/London") // null (exit before entry)
47
+ * @example crossingTime("2024-06-15T22:30:00Z", "2024-06-16T01:00:00Z", "Europe/Londres") // null
48
+ * @example crossingTime("2024-06-15T22:30:00", "2024-06-16T01:00:00Z", "Europe/London") // null (no offset designator: not a moment)
49
+ */
50
+ export function crossingTime(entry, exit, targetZone) {
51
+ try {
52
+ // fallow-ignore-next-line code-duplication -- not delegated to dwellTime: its transition walk returns null past 10,000 transitions, a false null for a long crossing, and its calendar-day count is work crossingTime does not use
53
+ if (!isValidInstant(entry) ||
54
+ !isValidInstant(exit) ||
55
+ !isValidTimeZone(targetZone)) {
56
+ return null;
57
+ }
58
+ const entryInstant = instantFrom(entry);
59
+ const exitInstant = instantFrom(exit);
60
+ if (Temporal.Instant.compare(entryInstant, exitInstant) > 0) {
61
+ return null;
62
+ }
63
+ return {
64
+ duration: entryInstant
65
+ .until(exitInstant, { largestUnit: "hours" })
66
+ .toString(),
67
+ enter: entryInstant.toZonedDateTimeISO(targetZone).toString(),
68
+ exit: exitInstant.toZonedDateTimeISO(targetZone).toString(),
69
+ };
70
+ }
71
+ catch {
72
+ // Never throws (Core Rule 3): a hostile
73
+ // argument is invalid input, not an exception.
74
+ return null;
75
+ }
76
+ }
@@ -0,0 +1,90 @@
1
+ import type { BusinessCalendar, RollConvention } from "../../types/index.js";
2
+ /** Options for `cutoffAt`. */
3
+ export interface CutoffOptions {
4
+ /** The time zone the cut-off is read in, the terminal's clock: an IANA name or a UTC offset. */
5
+ timeZone: string;
6
+ /**
7
+ * The local time of day the cut-off is pinned to (`"17:00"`), as `isValidTime` accepts.
8
+ *
9
+ * @defaultValue None. The cut-off is the offset taken off the anchor, with no time of day
10
+ * pinned.
11
+ */
12
+ atLocalTime?: string;
13
+ /**
14
+ * The working week and holidays the cut-off's local date is rolled against. Its `timeZone` is
15
+ * not read: `timeZone` above is the local frame. Requires `roll`.
16
+ *
17
+ * @defaultValue None. The cut-off's date is not rolled; a `roll` without it returns `""`.
18
+ */
19
+ calendar?: BusinessCalendar;
20
+ /**
21
+ * How a cut-off on a non-business day moves, as `rollDate` moves it. Requires `calendar`.
22
+ *
23
+ * @defaultValue None. The cut-off's date is not rolled; a `calendar` without it returns `""`.
24
+ */
25
+ roll?: RollConvention;
26
+ }
27
+ /**
28
+ * Find a deadline stated as an offset before an anchor event, in the local time of the place
29
+ * that enforces it.
30
+ *
31
+ * Logistics deadlines are not fixed timestamps: they count back from an event — a vessel's
32
+ * departure, a flight's, a container's loading — and they move when that event moves. An ocean
33
+ * booking carries a stack of them (documentation, VGM, gate-in, customs); `cutoffSchedule`
34
+ * computes the whole stack at once.
35
+ *
36
+ * - **`atLocalTime` is what makes this more than subtracting a duration.** A cut-off "two days
37
+ * before, 17:00" is 17:00 local on the date two days earlier — not 48 hours before, which
38
+ * keeps the departure's time of day, and moves by an hour when a DST transition falls in
39
+ * between. With `atLocalTime` only the day of the offset result matters: the offset's exact
40
+ * part (hours and smaller) comes off the anchor's instant, its calendar part (years, months,
41
+ * weeks, days) off that local date, and the cut-off is `atLocalTime` on the day it lands on.
42
+ * Because the exact part is taken off before the day is found, it can change the day: from
43
+ * midnight, `P2DT0.000000001S` lands a day earlier than `P2D`.
44
+ * - **Without `atLocalTime` the offset is taken off as Temporal's `ZonedDateTime#subtract`
45
+ * takes it:** the calendar part moves the local wall clock — `P2D` from 18:00 is 18:00, 47,
46
+ * 48 or 49 hours earlier — and the exact part is exact elapsed time — `PT96H` is 96 hours,
47
+ * whatever the clock does. This is the advance-filing shape.
48
+ * - **The anchor is the caller's event.** Loading, departure and arrival are different
49
+ * instants, and the same offset from the wrong one is late by days. `cutoffAt` never guesses
50
+ * which event a rule means. The anchor is exact: an instant (`Z`/offset) or a zoned string.
51
+ * Its bracket never supplies the zone — `timeZone` alone is the local frame — and is not
52
+ * checked, with one exception: an offset written to the minute that is the bracketed zone's
53
+ * sub-minute offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the
54
+ * zone gives, as `Temporal.ZonedDateTime.from` reads it. The anchor is not cached: a
55
+ * rescheduled departure is a new call.
56
+ * - **Non-business days roll as the caller says.** With `calendar`, a cut-off on a weekend or
57
+ * holiday moves by `roll`, as `rollDate` moves it. Every industry answers "what if it lands
58
+ * on a non-working day" differently, so the convention is always explicit — there is no
59
+ * default: `calendar` without `roll`, or `roll` without `calendar`, returns `""`. The rolled
60
+ * day keeps the cut-off's local time of day. `calendar.timeZone` is not read; `timeZone` is
61
+ * the local frame. `"endOfMonth"` is `rollDate`'s schedule tool, not a cut-off convention.
62
+ * - **The order is not checked.** `cutoffAt` does not check that the cut-off comes before the
63
+ * anchor: a negative offset, `P0D` with a late `atLocalTime`, `"following"` or `"endOfMonth"`
64
+ * can each put it after.
65
+ * - **Local-time resolution.** Every local wall time the cut-off lands on — `atLocalTime`, the
66
+ * calendar part of an unpinned offset, a rolled day — is resolved as `resolveLocal` describes
67
+ * it: an **ambiguous** wall time (a fall-back hour the clock ran through twice) takes the
68
+ * **earlier** instant — RFC 5545 §3.3.5's "first occurrence of the referenced time" — and a
69
+ * **nonexistent** one (a skipped hour, a deleted day) returns `""` rather than being
70
+ * shifted. An exact result that is not re-resolved stays as it is.
71
+ * - Returns the cut-off as a zoned string in `timeZone`, or `""` on invalid input.
72
+ *
73
+ * @param anchor ISO 8601 instant or zoned datetime string of the event the deadline counts back from
74
+ * @param offset ISO 8601 duration before the anchor
75
+ * @param options The zone the cut-off is read in, the time of day it is pinned to, and how it rolls off a non-business day
76
+ * @returns ISO 8601 zoned datetime string of the cut-off, or "" on invalid input
77
+ *
78
+ * @example cutoffAt("2024-06-14T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00" }) // "2024-06-12T17:00:00+02:00[Europe/Amsterdam]"
79
+ * @example cutoffAt("2024-06-14T16:00:00Z", "PT48H", { timeZone: "Europe/Amsterdam" }) // "2024-06-12T18:00:00+02:00[Europe/Amsterdam]" (48 hours keeps the departure's 18:00)
80
+ * @example cutoffAt("2024-06-14T16:00:00Z", "P1D", { timeZone: "Europe/Amsterdam", atLocalTime: "10:00" }) // "2024-06-13T10:00:00+02:00[Europe/Amsterdam]"
81
+ * @example cutoffAt("2024-11-05T17:00:00Z", "PT96H", { timeZone: "America/New_York" }) // "2024-11-01T13:00:00-04:00[America/New_York]" (96 elapsed hours across the fall-back)
82
+ * @example cutoffAt("2024-03-11T22:00:00Z", "P2D", { timeZone: "America/New_York", atLocalTime: "17:00" }) // "2024-03-09T17:00:00-05:00[America/New_York]" (17:00 local, across the spring-forward)
83
+ * @example cutoffAt("2024-06-18T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00", calendar: { weekend: [6, 7], holidays: [], timeZone: "Europe/Amsterdam" }, roll: "preceding" }) // "2024-06-14T17:00:00+02:00[Europe/Amsterdam]" (Sunday rolls back to Friday)
84
+ * @example cutoffAt("2024-06-18T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", atLocalTime: "17:00", calendar: { weekend: [6, 7], holidays: [], timeZone: "Europe/Amsterdam" } }) // "" (a calendar needs a roll convention)
85
+ * @example cutoffAt("2024-11-04T23:00:00Z", "P1D", { timeZone: "America/New_York", atLocalTime: "01:30" }) // "2024-11-03T01:30:00-04:00[America/New_York]" (a repeated hour takes the earlier pass)
86
+ * @example cutoffAt("2024-03-11T22:00:00Z", "P1D", { timeZone: "America/New_York", atLocalTime: "02:30" }) // "" (02:30 on 10 March never happened)
87
+ * @example cutoffAt("2024-06-14T18:00:00", "P2D", { timeZone: "Europe/Amsterdam" }) // "" (a zoneless anchor is not a moment)
88
+ * @example cutoffAt("2024-06-14T16:00:00Z", "P2D", { timeZone: "Europe/Amsterdam", roll: "preceding" }) // "" (a roll needs a calendar)
89
+ */
90
+ export declare function cutoffAt(anchor: string, offset: string, options: CutoffOptions): string;