@northguild/gmt 1.18.0 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/README.md +55 -2920
  2. package/dist/calendar/calculate/bucketRange.d.ts +10 -2
  3. package/dist/calendar/calculate/bucketRange.js +18 -61
  4. package/dist/calendar/calculate/floorToZone.d.ts +10 -2
  5. package/dist/calendar/calculate/floorToZone.js +15 -7
  6. package/dist/calendar/hours/addOperatingTime.d.ts +6 -0
  7. package/dist/calendar/hours/addOperatingTime.js +7 -1
  8. package/dist/calendar/hours/isOpenAt.d.ts +6 -0
  9. package/dist/calendar/hours/isOpenAt.js +6 -0
  10. package/dist/calendar/hours/nextCloseAt.d.ts +6 -0
  11. package/dist/calendar/hours/nextCloseAt.js +7 -1
  12. package/dist/calendar/hours/nextOpenAt.d.ts +6 -0
  13. package/dist/calendar/hours/nextOpenAt.js +7 -1
  14. package/dist/calendar/hours/operatingIntervals.d.ts +5 -0
  15. package/dist/calendar/hours/operatingIntervals.js +5 -0
  16. package/dist/calendar/hours/operatingTimeBetween.d.ts +5 -0
  17. package/dist/calendar/hours/operatingTimeBetween.js +5 -0
  18. package/dist/calendar/hours/recurringWindows.d.ts +8 -1
  19. package/dist/calendar/hours/recurringWindows.js +12 -4
  20. package/dist/duration/calculate/durationFromUnits.d.ts +47 -0
  21. package/dist/duration/calculate/durationFromUnits.js +67 -0
  22. package/dist/duration/calculate/getDurationUnit.d.ts +2 -2
  23. package/dist/duration/calculate/getDurationUnit.js +2 -2
  24. package/dist/duration/calculate/index.d.ts +3 -1
  25. package/dist/duration/calculate/index.js +3 -1
  26. package/dist/duration/calculate/negateDuration.d.ts +1 -1
  27. package/dist/duration/calculate/negateDuration.js +1 -1
  28. package/dist/duration/calculate/{durationAs.d.ts → totalDuration.d.ts} +25 -19
  29. package/dist/duration/calculate/{durationAs.js → totalDuration.js} +25 -19
  30. package/dist/duration/calculate/totalUnits.d.ts +49 -0
  31. package/dist/duration/calculate/totalUnits.js +73 -0
  32. package/dist/duration/compare/compareDurations.d.ts +1 -1
  33. package/dist/duration/compare/compareDurations.js +1 -1
  34. package/dist/duty/calculate/dutyDayFor.d.ts +38 -0
  35. package/dist/duty/calculate/dutyDayFor.js +71 -0
  36. package/dist/duty/calculate/dutyTotals.d.ts +24 -0
  37. package/dist/duty/calculate/dutyTotals.js +41 -0
  38. package/dist/duty/calculate/dutyViolations.d.ts +74 -0
  39. package/dist/duty/calculate/dutyViolations.js +65 -0
  40. package/dist/duty/calculate/evaluateDutyLog.d.ts +77 -0
  41. package/dist/duty/calculate/evaluateDutyLog.js +75 -0
  42. package/dist/duty/calculate/index.d.ts +7 -0
  43. package/dist/duty/calculate/index.js +7 -0
  44. package/dist/duty/calculate/longestRun.d.ts +28 -0
  45. package/dist/duty/calculate/longestRun.js +54 -0
  46. package/dist/duty/calculate/qualifyingRestPairs.d.ts +37 -0
  47. package/dist/duty/calculate/qualifyingRestPairs.js +58 -0
  48. package/dist/duty/calculate/qualifyingRests.d.ts +27 -0
  49. package/dist/duty/calculate/qualifyingRests.js +49 -0
  50. package/dist/duty/index.d.ts +3 -0
  51. package/dist/duty/index.js +4 -0
  52. package/dist/duty/validate/index.d.ts +1 -0
  53. package/dist/duty/validate/index.js +1 -0
  54. package/dist/duty/validate/isValidDutyLog.d.ts +24 -0
  55. package/dist/duty/validate/isValidDutyLog.js +34 -0
  56. package/dist/index.d.ts +1 -0
  57. package/dist/index.js +1 -0
  58. package/dist/instant/convert/classifyLocal.d.ts +5 -1
  59. package/dist/instant/convert/classifyLocal.js +16 -6
  60. package/dist/instant/convert/fromOffsetInstant.d.ts +4 -0
  61. package/dist/instant/convert/fromOffsetInstant.js +6 -1
  62. package/dist/instant/convert/resolveLocal.d.ts +7 -2
  63. package/dist/instant/convert/resolveLocal.js +16 -8
  64. package/dist/instant/convert/toOffsetInstant.d.ts +12 -8
  65. package/dist/instant/convert/toOffsetInstant.js +19 -11
  66. package/dist/instant/index.d.ts +1 -0
  67. package/dist/instant/index.js +1 -0
  68. package/dist/instant/validate/index.d.ts +1 -0
  69. package/dist/instant/validate/index.js +1 -0
  70. package/dist/instant/validate/isValidUtcOffset.d.ts +32 -0
  71. package/dist/instant/validate/isValidUtcOffset.js +35 -0
  72. package/dist/intermodal/calculate/chargeableDays.d.ts +6 -0
  73. package/dist/intermodal/calculate/chargeableDays.js +12 -4
  74. package/dist/intermodal/calculate/freeTimeExpiry.d.ts +7 -0
  75. package/dist/intermodal/calculate/freeTimeExpiry.js +15 -4
  76. package/dist/intermodal/calculate/index.d.ts +1 -0
  77. package/dist/intermodal/calculate/index.js +1 -0
  78. package/dist/intermodal/calculate/multimodalETA.d.ts +76 -0
  79. package/dist/intermodal/calculate/multimodalETA.js +145 -0
  80. package/dist/intermodal/format/bolTimestamp.d.ts +76 -0
  81. package/dist/intermodal/format/bolTimestamp.js +78 -0
  82. package/dist/intermodal/format/formatEdifactDate.d.ts +34 -0
  83. package/dist/intermodal/format/formatEdifactDate.js +42 -0
  84. package/dist/intermodal/format/formatEdifactDatePeriod.d.ts +35 -0
  85. package/dist/intermodal/format/formatEdifactDatePeriod.js +43 -0
  86. package/dist/intermodal/format/formatEdifactDateTime.d.ts +37 -0
  87. package/dist/intermodal/format/formatEdifactDateTime.js +45 -0
  88. package/dist/intermodal/format/formatEdifactDateTimePeriod.d.ts +40 -0
  89. package/dist/intermodal/format/formatEdifactDateTimePeriod.js +48 -0
  90. package/dist/intermodal/format/formatEdifactOffsetDateTime.d.ts +62 -0
  91. package/dist/intermodal/format/formatEdifactOffsetDateTime.js +70 -0
  92. package/dist/intermodal/format/formatEdifactTime.d.ts +35 -0
  93. package/dist/intermodal/format/formatEdifactTime.js +43 -0
  94. package/dist/intermodal/format/formatEpcisEvent.d.ts +47 -0
  95. package/dist/intermodal/format/formatEpcisEvent.js +79 -0
  96. package/dist/intermodal/format/formatX12Date.d.ts +35 -0
  97. package/dist/intermodal/format/formatX12Date.js +43 -0
  98. package/dist/intermodal/format/formatX12DateRange.d.ts +37 -0
  99. package/dist/intermodal/format/formatX12DateRange.js +45 -0
  100. package/dist/intermodal/format/formatX12DateTime.d.ts +39 -0
  101. package/dist/intermodal/format/formatX12DateTime.js +47 -0
  102. package/dist/intermodal/format/formatX12DateTimeRange.d.ts +40 -0
  103. package/dist/intermodal/format/formatX12DateTimeRange.js +48 -0
  104. package/dist/intermodal/format/formatX12Time.d.ts +42 -0
  105. package/dist/intermodal/format/formatX12Time.js +50 -0
  106. package/dist/intermodal/format/formatX12TimeElement.d.ts +46 -0
  107. package/dist/intermodal/format/formatX12TimeElement.js +54 -0
  108. package/dist/intermodal/format/index.d.ts +14 -0
  109. package/dist/intermodal/format/index.js +14 -0
  110. package/dist/intermodal/index.d.ts +3 -0
  111. package/dist/intermodal/index.js +3 -0
  112. package/dist/intermodal/parse/classifyEdifactDtmFormat.d.ts +48 -0
  113. package/dist/intermodal/parse/classifyEdifactDtmFormat.js +55 -0
  114. package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.d.ts +50 -0
  115. package/dist/intermodal/parse/classifyX12DateTimePeriodFormat.js +57 -0
  116. package/dist/intermodal/parse/classifyX12TimeCode.d.ts +46 -0
  117. package/dist/intermodal/parse/classifyX12TimeCode.js +57 -0
  118. package/dist/intermodal/parse/index.d.ts +18 -0
  119. package/dist/intermodal/parse/index.js +18 -0
  120. package/dist/intermodal/parse/parseEdifactDate.d.ts +37 -0
  121. package/dist/intermodal/parse/parseEdifactDate.js +45 -0
  122. package/dist/intermodal/parse/parseEdifactDatePeriod.d.ts +43 -0
  123. package/dist/intermodal/parse/parseEdifactDatePeriod.js +51 -0
  124. package/dist/intermodal/parse/parseEdifactDateTime.d.ts +43 -0
  125. package/dist/intermodal/parse/parseEdifactDateTime.js +51 -0
  126. package/dist/intermodal/parse/parseEdifactDateTimePeriod.d.ts +45 -0
  127. package/dist/intermodal/parse/parseEdifactDateTimePeriod.js +53 -0
  128. package/dist/intermodal/parse/parseEdifactOffsetDateTime.d.ts +60 -0
  129. package/dist/intermodal/parse/parseEdifactOffsetDateTime.js +68 -0
  130. package/dist/intermodal/parse/parseEdifactTime.d.ts +37 -0
  131. package/dist/intermodal/parse/parseEdifactTime.js +45 -0
  132. package/dist/intermodal/parse/parseEpcisEvent.d.ts +95 -0
  133. package/dist/intermodal/parse/parseEpcisEvent.js +102 -0
  134. package/dist/intermodal/parse/parseX12Date.d.ts +39 -0
  135. package/dist/intermodal/parse/parseX12Date.js +47 -0
  136. package/dist/intermodal/parse/parseX12DateAndTime.d.ts +52 -0
  137. package/dist/intermodal/parse/parseX12DateAndTime.js +61 -0
  138. package/dist/intermodal/parse/parseX12DateRange.d.ts +44 -0
  139. package/dist/intermodal/parse/parseX12DateRange.js +52 -0
  140. package/dist/intermodal/parse/parseX12DateTime.d.ts +45 -0
  141. package/dist/intermodal/parse/parseX12DateTime.js +53 -0
  142. package/dist/intermodal/parse/parseX12DateTimeRange.d.ts +46 -0
  143. package/dist/intermodal/parse/parseX12DateTimeRange.js +54 -0
  144. package/dist/intermodal/parse/parseX12Time.d.ts +65 -0
  145. package/dist/intermodal/parse/parseX12Time.js +77 -0
  146. package/dist/intermodal/parse/x12TimeCodeOffset.d.ts +57 -0
  147. package/dist/intermodal/parse/x12TimeCodeOffset.js +110 -0
  148. package/dist/intermodal/parse/x12TimeCodeZone.d.ts +57 -0
  149. package/dist/intermodal/parse/x12TimeCodeZone.js +105 -0
  150. package/dist/intermodal/validate/index.d.ts +18 -0
  151. package/dist/intermodal/validate/index.js +18 -0
  152. package/dist/intermodal/validate/isValidEdifactDate.d.ts +26 -0
  153. package/dist/intermodal/validate/isValidEdifactDate.js +28 -0
  154. package/dist/intermodal/validate/isValidEdifactDatePeriod.d.ts +28 -0
  155. package/dist/intermodal/validate/isValidEdifactDatePeriod.js +30 -0
  156. package/dist/intermodal/validate/isValidEdifactDateTime.d.ts +30 -0
  157. package/dist/intermodal/validate/isValidEdifactDateTime.js +32 -0
  158. package/dist/intermodal/validate/isValidEdifactDateTimePeriod.d.ts +28 -0
  159. package/dist/intermodal/validate/isValidEdifactDateTimePeriod.js +30 -0
  160. package/dist/intermodal/validate/isValidEdifactDtmFormat.d.ts +39 -0
  161. package/dist/intermodal/validate/isValidEdifactDtmFormat.js +42 -0
  162. package/dist/intermodal/validate/isValidEdifactOffsetDateTime.d.ts +36 -0
  163. package/dist/intermodal/validate/isValidEdifactOffsetDateTime.js +38 -0
  164. package/dist/intermodal/validate/isValidEdifactTime.d.ts +28 -0
  165. package/dist/intermodal/validate/isValidEdifactTime.js +30 -0
  166. package/dist/intermodal/validate/isValidEpcisEvent.d.ts +41 -0
  167. package/dist/intermodal/validate/isValidEpcisEvent.js +58 -0
  168. package/dist/intermodal/validate/isValidEpcisEventTime.d.ts +33 -0
  169. package/dist/intermodal/validate/isValidEpcisEventTime.js +48 -0
  170. package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.d.ts +30 -0
  171. package/dist/intermodal/validate/isValidEpcisTimeZoneOffset.js +38 -0
  172. package/dist/intermodal/validate/isValidX12Date.d.ts +28 -0
  173. package/dist/intermodal/validate/isValidX12Date.js +30 -0
  174. package/dist/intermodal/validate/isValidX12DateAndTime.d.ts +32 -0
  175. package/dist/intermodal/validate/isValidX12DateAndTime.js +35 -0
  176. package/dist/intermodal/validate/isValidX12DateRange.d.ts +29 -0
  177. package/dist/intermodal/validate/isValidX12DateRange.js +31 -0
  178. package/dist/intermodal/validate/isValidX12DateTime.d.ts +30 -0
  179. package/dist/intermodal/validate/isValidX12DateTime.js +32 -0
  180. package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.d.ts +43 -0
  181. package/dist/intermodal/validate/isValidX12DateTimePeriodFormat.js +46 -0
  182. package/dist/intermodal/validate/isValidX12DateTimeRange.d.ts +31 -0
  183. package/dist/intermodal/validate/isValidX12DateTimeRange.js +33 -0
  184. package/dist/intermodal/validate/isValidX12Time.d.ts +38 -0
  185. package/dist/intermodal/validate/isValidX12Time.js +40 -0
  186. package/dist/intermodal/validate/isValidX12TimeCode.d.ts +38 -0
  187. package/dist/intermodal/validate/isValidX12TimeCode.js +41 -0
  188. package/dist/internal/businessCalendar.js +4 -9
  189. package/dist/internal/dutyEngine.d.ts +125 -0
  190. package/dist/internal/dutyEngine.js +1746 -0
  191. package/dist/internal/dutyLog.d.ts +27 -0
  192. package/dist/internal/dutyLog.js +47 -0
  193. package/dist/internal/dutyPeriods.d.ts +135 -0
  194. package/dist/internal/dutyPeriods.js +369 -0
  195. package/dist/internal/dutyRules.d.ts +197 -0
  196. package/dist/internal/dutyRules.js +484 -0
  197. package/dist/internal/ediDateTimeFields.d.ts +97 -0
  198. package/dist/internal/ediDateTimeFields.js +288 -0
  199. package/dist/internal/ediDateTimeWriter.d.ts +92 -0
  200. package/dist/internal/ediDateTimeWriter.js +298 -0
  201. package/dist/internal/ediGrammar.d.ts +158 -0
  202. package/dist/internal/ediGrammar.js +384 -0
  203. package/dist/internal/englishCalendarNames.d.ts +3 -1
  204. package/dist/internal/englishCalendarNames.js +3 -1
  205. package/dist/internal/freeTimeLedger.d.ts +5 -0
  206. package/dist/internal/freeTimeLedger.js +11 -2
  207. package/dist/internal/index.d.ts +5 -2
  208. package/dist/internal/index.js +9 -2
  209. package/dist/internal/intervalNanoseconds.js +2 -1
  210. package/dist/internal/isObject.d.ts +13 -6
  211. package/dist/internal/isObject.js +14 -7
  212. package/dist/internal/isoYearString.d.ts +21 -0
  213. package/dist/internal/isoYearString.js +27 -0
  214. package/dist/internal/maxPieces.js +2 -1
  215. package/dist/internal/normalizeTimeZone.d.ts +4 -1
  216. package/dist/internal/normalizeTimeZone.js +4 -1
  217. package/dist/internal/operatingSchedule.d.ts +13 -4
  218. package/dist/internal/operatingSchedule.js +146 -58
  219. package/dist/internal/patternToken.d.ts +10 -3
  220. package/dist/internal/patternToken.js +31 -12
  221. package/dist/internal/readDurationUnits.d.ts +34 -0
  222. package/dist/internal/readDurationUnits.js +78 -0
  223. package/dist/internal/readSetFields.d.ts +50 -0
  224. package/dist/internal/readSetFields.js +179 -0
  225. package/dist/internal/resolveRelativeUnit.d.ts +1 -1
  226. package/dist/internal/resolveRelativeUnit.js +1 -1
  227. package/dist/internal/resolveUnixIntervalPair.d.ts +8 -2
  228. package/dist/internal/resolveUnixIntervalPair.js +11 -7
  229. package/dist/internal/startOrEndOfUnix.d.ts +2 -1
  230. package/dist/internal/startOrEndOfUnix.js +9 -6
  231. package/dist/internal/twoDigitYear.d.ts +19 -0
  232. package/dist/internal/twoDigitYear.js +22 -0
  233. package/dist/internal/unixEpochValue.js +3 -2
  234. package/dist/internal/unixWallClock.d.ts +24 -0
  235. package/dist/internal/unixWallClock.js +35 -0
  236. package/dist/internal/utcWallClock.d.ts +20 -0
  237. package/dist/internal/utcWallClock.js +32 -0
  238. package/dist/internal/yearWindowStart.d.ts +28 -0
  239. package/dist/internal/yearWindowStart.js +52 -0
  240. package/dist/internal/zoneBucketCap.d.ts +18 -0
  241. package/dist/internal/zoneBucketCap.js +64 -0
  242. package/dist/internal/zoneFrame.d.ts +180 -0
  243. package/dist/internal/zoneFrame.js +221 -0
  244. package/dist/internal/zonedNowUnitValue.d.ts +7 -4
  245. package/dist/internal/zonedNowUnitValue.js +8 -4
  246. package/dist/internal/zonedWallClockDifference.js +4 -4
  247. package/dist/internal/zonedWallClockOperations.d.ts +5 -2
  248. package/dist/internal/zonedWallClockOperations.js +7 -10
  249. package/dist/plain/calculate/addDate.js +4 -7
  250. package/dist/plain/calculate/addDateTime.js +4 -7
  251. package/dist/plain/calculate/addTime.js +4 -7
  252. package/dist/plain/calculate/endOfTime.d.ts +1 -1
  253. package/dist/plain/calculate/setDate.d.ts +20 -3
  254. package/dist/plain/calculate/setDate.js +27 -7
  255. package/dist/plain/calculate/setDateTime.d.ts +15 -3
  256. package/dist/plain/calculate/setDateTime.js +22 -7
  257. package/dist/plain/calculate/setTime.d.ts +13 -1
  258. package/dist/plain/calculate/setTime.js +21 -6
  259. package/dist/plain/calculate/startOfTime.d.ts +1 -1
  260. package/dist/plain/calculate/subtractDate.js +4 -7
  261. package/dist/plain/calculate/subtractDateTime.js +4 -7
  262. package/dist/plain/calculate/subtractTime.js +4 -7
  263. package/dist/plain/format/formatCalendar.js +2 -1
  264. package/dist/plain/format/formatRelativeDate.js +2 -1
  265. package/dist/plain/format/formatRelativeDateTime.js +2 -1
  266. package/dist/plain/format/formatRelativeTime.js +2 -1
  267. package/dist/plain/format/{formatSql.d.ts → formatSqlDateTime.d.ts} +7 -7
  268. package/dist/plain/format/{formatSql.js → formatSqlDateTime.js} +7 -7
  269. package/dist/plain/format/index.d.ts +1 -1
  270. package/dist/plain/format/index.js +1 -1
  271. package/dist/plain/get/getNowUnit.d.ts +2 -0
  272. package/dist/plain/get/getNowUnit.js +2 -0
  273. package/dist/plain/get/getYear.d.ts +2 -0
  274. package/dist/plain/get/getYear.js +4 -3
  275. package/dist/plain/interval/intervalXorAllDate.js +2 -2
  276. package/dist/plain/interval/intervalXorAllDateTime.js +2 -2
  277. package/dist/plain/interval/intervalXorAllTime.js +2 -2
  278. package/dist/plain/interval/mergeIntervalsDate.js +2 -2
  279. package/dist/plain/interval/mergeIntervalsDateTime.js +2 -2
  280. package/dist/plain/interval/mergeIntervalsTime.js +2 -2
  281. package/dist/plain/parse/index.d.ts +1 -1
  282. package/dist/plain/parse/index.js +1 -1
  283. package/dist/plain/parse/parseDateTimeWithPattern.d.ts +16 -3
  284. package/dist/plain/parse/parseDateTimeWithPattern.js +20 -5
  285. package/dist/plain/parse/parseDateWithPattern.d.ts +17 -3
  286. package/dist/plain/parse/parseDateWithPattern.js +21 -5
  287. package/dist/plain/parse/{parseSql.d.ts → parseSqlDateTime.d.ts} +8 -8
  288. package/dist/plain/parse/{parseSql.js → parseSqlDateTime.js} +8 -8
  289. package/dist/plain/parse/parseTimeWithPattern.js +1 -0
  290. package/dist/plain/parse/parseUnitFromDate.d.ts +3 -0
  291. package/dist/plain/parse/parseUnitFromDate.js +5 -1
  292. package/dist/plain/parse/parseUnitFromDateTime.d.ts +3 -0
  293. package/dist/plain/parse/parseUnitFromDateTime.js +5 -1
  294. package/dist/plain/parse/parseYearFromDate.d.ts +5 -2
  295. package/dist/plain/parse/parseYearFromDate.js +7 -3
  296. package/dist/plain/parse/parseYearFromDateTime.d.ts +4 -2
  297. package/dist/plain/parse/parseYearFromDateTime.js +6 -3
  298. package/dist/plain/validate/index.d.ts +1 -0
  299. package/dist/plain/validate/index.js +1 -0
  300. package/dist/plain/validate/isValidSqlDateTime.d.ts +33 -0
  301. package/dist/plain/validate/isValidSqlDateTime.js +36 -0
  302. package/dist/precision/convert/fromNanoseconds.d.ts +9 -3
  303. package/dist/precision/convert/fromNanoseconds.js +9 -3
  304. package/dist/regex/epcis.d.ts +60 -0
  305. package/dist/regex/epcis.js +60 -0
  306. package/dist/regex/http-date.d.ts +6 -4
  307. package/dist/regex/http-date.js +6 -4
  308. package/dist/regex/index.d.ts +1 -0
  309. package/dist/regex/index.js +1 -0
  310. package/dist/regex/rfc-2822.d.ts +2 -0
  311. package/dist/regex/rfc-2822.js +2 -0
  312. package/dist/regex/rfc-3339.d.ts +3 -1
  313. package/dist/regex/rfc-3339.js +3 -1
  314. package/dist/regex/sql-date-time.d.ts +2 -1
  315. package/dist/regex/sql-date-time.js +2 -1
  316. package/dist/regex/time-zone-like.d.ts +3 -2
  317. package/dist/regex/time-zone-like.js +3 -2
  318. package/dist/regex/utc-offset.d.ts +2 -1
  319. package/dist/regex/utc-offset.js +2 -1
  320. package/dist/transport/calculate/crossingTime.d.ts +6 -1
  321. package/dist/transport/calculate/crossingTime.js +6 -1
  322. package/dist/transport/calculate/cutoffAt.d.ts +6 -1
  323. package/dist/transport/calculate/cutoffAt.js +2 -0
  324. package/dist/transport/calculate/cutoffSchedule.d.ts +6 -1
  325. package/dist/transport/calculate/cutoffSchedule.js +2 -0
  326. package/dist/transport/calculate/dwellTime.d.ts +6 -1
  327. package/dist/transport/calculate/dwellTime.js +6 -1
  328. package/dist/transport/calculate/scheduleDelivery.d.ts +13 -5
  329. package/dist/transport/calculate/scheduleDelivery.js +6 -1
  330. package/dist/transport/convert/etaAtZone.d.ts +6 -1
  331. package/dist/transport/convert/etaAtZone.js +6 -1
  332. package/dist/types/business-calendar.d.ts +5 -4
  333. package/dist/types/duty.d.ts +777 -0
  334. package/dist/types/duty.js +0 -0
  335. package/dist/types/edi.d.ts +407 -0
  336. package/dist/types/edi.js +0 -0
  337. package/dist/types/epcis.d.ts +25 -0
  338. package/dist/types/epcis.js +0 -0
  339. package/dist/types/exact-duration-unit.d.ts +8 -0
  340. package/dist/types/exact-duration-unit.js +0 -0
  341. package/dist/types/free-time-options.d.ts +4 -3
  342. package/dist/types/index.d.ts +5 -0
  343. package/dist/types/index.js +5 -0
  344. package/dist/types/operating-schedule.d.ts +3 -2
  345. package/dist/types/two-digit-year.d.ts +23 -0
  346. package/dist/types/two-digit-year.js +0 -0
  347. package/dist/types/zone-bucket-unit.d.ts +1 -1
  348. package/dist/unix/calculate/addUnix.d.ts +11 -2
  349. package/dist/unix/calculate/addUnix.js +14 -11
  350. package/dist/unix/calculate/diffUnix.d.ts +10 -2
  351. package/dist/unix/calculate/diffUnix.js +11 -6
  352. package/dist/unix/calculate/diffUnixAsDuration.d.ts +10 -2
  353. package/dist/unix/calculate/diffUnixAsDuration.js +10 -5
  354. package/dist/unix/calculate/endOfQuarterForUnix.d.ts +10 -2
  355. package/dist/unix/calculate/endOfQuarterForUnix.js +6 -0
  356. package/dist/unix/calculate/endOfUnix.d.ts +11 -2
  357. package/dist/unix/calculate/endOfUnix.js +7 -0
  358. package/dist/unix/calculate/isBetweenUnix.d.ts +3 -2
  359. package/dist/unix/calculate/isBetweenUnix.js +3 -3
  360. package/dist/unix/calculate/roundUnix.d.ts +10 -2
  361. package/dist/unix/calculate/roundUnix.js +13 -6
  362. package/dist/unix/calculate/setUnix.d.ts +25 -5
  363. package/dist/unix/calculate/setUnix.js +33 -12
  364. package/dist/unix/calculate/startOfQuarterForUnix.d.ts +10 -2
  365. package/dist/unix/calculate/startOfQuarterForUnix.js +6 -0
  366. package/dist/unix/calculate/startOfUnix.d.ts +11 -2
  367. package/dist/unix/calculate/startOfUnix.js +7 -0
  368. package/dist/unix/calculate/subtractUnix.d.ts +10 -2
  369. package/dist/unix/calculate/subtractUnix.js +13 -11
  370. package/dist/unix/compare/areUnixEqualBy.d.ts +11 -2
  371. package/dist/unix/compare/areUnixEqualBy.js +7 -0
  372. package/dist/unix/convert/convertUnixToPlainDate.d.ts +5 -2
  373. package/dist/unix/convert/convertUnixToPlainDate.js +5 -4
  374. package/dist/unix/convert/convertUnixToPlainDateTime.d.ts +5 -2
  375. package/dist/unix/convert/convertUnixToPlainDateTime.js +5 -4
  376. package/dist/unix/convert/convertUnixToPlainTime.d.ts +5 -2
  377. package/dist/unix/convert/convertUnixToPlainTime.js +5 -4
  378. package/dist/unix/convert/convertUnixToZoned.d.ts +5 -1
  379. package/dist/unix/convert/convertUnixToZoned.js +5 -1
  380. package/dist/unix/format/formatCalendarUnix.d.ts +6 -2
  381. package/dist/unix/format/formatCalendarUnix.js +6 -1
  382. package/dist/unix/format/formatRelativeUnix.d.ts +11 -3
  383. package/dist/unix/format/formatRelativeUnix.js +13 -5
  384. package/dist/unix/format/formatUnix.d.ts +7 -2
  385. package/dist/unix/format/formatUnix.js +4 -0
  386. package/dist/unix/get/getUnixDay.d.ts +1 -3
  387. package/dist/unix/get/getUnixDay.js +5 -12
  388. package/dist/unix/get/getUnixHour.d.ts +1 -3
  389. package/dist/unix/get/getUnixHour.js +5 -12
  390. package/dist/unix/get/getUnixMicrosecond.d.ts +1 -3
  391. package/dist/unix/get/getUnixMicrosecond.js +4 -11
  392. package/dist/unix/get/getUnixMillisecond.d.ts +1 -3
  393. package/dist/unix/get/getUnixMillisecond.js +5 -12
  394. package/dist/unix/get/getUnixMinute.d.ts +1 -3
  395. package/dist/unix/get/getUnixMinute.js +5 -12
  396. package/dist/unix/get/getUnixMonth.d.ts +1 -3
  397. package/dist/unix/get/getUnixMonth.js +5 -12
  398. package/dist/unix/get/getUnixNanosecond.d.ts +1 -3
  399. package/dist/unix/get/getUnixNanosecond.js +4 -11
  400. package/dist/unix/get/getUnixNowUnit.d.ts +2 -0
  401. package/dist/unix/get/getUnixNowUnit.js +2 -0
  402. package/dist/unix/get/getUnixSecond.d.ts +1 -3
  403. package/dist/unix/get/getUnixSecond.js +5 -12
  404. package/dist/unix/get/getUnixYear.d.ts +3 -3
  405. package/dist/unix/get/getUnixYear.js +5 -12
  406. package/dist/unix/interval/intervalCountUnix.d.ts +11 -2
  407. package/dist/unix/interval/intervalCountUnix.js +7 -0
  408. package/dist/unix/interval/intervalFromDurationUnix.d.ts +10 -2
  409. package/dist/unix/interval/intervalFromDurationUnix.js +12 -7
  410. package/dist/unix/interval/intervalLengthUnix.d.ts +10 -2
  411. package/dist/unix/interval/intervalLengthUnix.js +6 -0
  412. package/dist/unix/interval/intervalOverlappingDaysUnix.d.ts +10 -2
  413. package/dist/unix/interval/intervalOverlappingDaysUnix.js +10 -5
  414. package/dist/unix/interval/splitIntervalByUnitUnix.d.ts +10 -2
  415. package/dist/unix/interval/splitIntervalByUnitUnix.js +12 -6
  416. package/dist/unix/parse/parseDateFromUnix.d.ts +4 -2
  417. package/dist/unix/parse/parseDateFromUnix.js +3 -3
  418. package/dist/unix/parse/parseDayFromUnix.d.ts +4 -2
  419. package/dist/unix/parse/parseDayOfWeekFromUnix.d.ts +4 -2
  420. package/dist/unix/parse/parseDayOfWeekFromUnix.js +2 -2
  421. package/dist/unix/parse/parseHourFromUnix.d.ts +4 -2
  422. package/dist/unix/parse/parseMicrosecondFromUnix.d.ts +4 -2
  423. package/dist/unix/parse/parseMillisecondFromUnix.d.ts +4 -2
  424. package/dist/unix/parse/parseMinuteFromUnix.d.ts +4 -2
  425. package/dist/unix/parse/parseMonthFromUnix.d.ts +4 -2
  426. package/dist/unix/parse/parseNanosecondFromUnix.d.ts +4 -2
  427. package/dist/unix/parse/parseSecondFromUnix.d.ts +4 -2
  428. package/dist/unix/parse/parseTimeFromUnix.d.ts +5 -2
  429. package/dist/unix/parse/parseTimeFromUnix.js +4 -3
  430. package/dist/unix/parse/parseUnitFromUnix.d.ts +9 -3
  431. package/dist/unix/parse/parseUnitFromUnix.js +21 -14
  432. package/dist/unix/parse/parseWeekFromUnix.d.ts +3 -2
  433. package/dist/unix/parse/parseWeekFromUnix.js +4 -4
  434. package/dist/unix/parse/parseYearFromUnix.d.ts +8 -3
  435. package/dist/unix/parse/parseYearFromUnix.js +4 -1
  436. package/dist/unix/validate/isValidUnixUnit.d.ts +1 -1
  437. package/dist/utc/calculate/addUtc.js +4 -7
  438. package/dist/utc/calculate/setUtc.d.ts +16 -3
  439. package/dist/utc/calculate/setUtc.js +22 -8
  440. package/dist/utc/calculate/subtractUtc.js +4 -7
  441. package/dist/utc/convert/convertUtcToPlainDate.d.ts +8 -2
  442. package/dist/utc/convert/convertUtcToPlainDate.js +10 -7
  443. package/dist/utc/convert/convertUtcToPlainDateTime.d.ts +9 -2
  444. package/dist/utc/convert/convertUtcToPlainDateTime.js +12 -13
  445. package/dist/utc/convert/convertUtcToPlainTime.d.ts +5 -2
  446. package/dist/utc/convert/convertUtcToPlainTime.js +7 -6
  447. package/dist/utc/convert/convertUtcToZoned.d.ts +5 -1
  448. package/dist/utc/convert/convertUtcToZoned.js +5 -1
  449. package/dist/utc/format/formatCalendarUtc.d.ts +6 -2
  450. package/dist/utc/format/formatCalendarUtc.js +6 -1
  451. package/dist/utc/format/{formatHttp.d.ts → formatHttpDate.d.ts} +7 -7
  452. package/dist/utc/format/{formatHttp.js → formatHttpDate.js} +7 -7
  453. package/dist/utc/format/formatRelativeUtc.d.ts +11 -3
  454. package/dist/utc/format/formatRelativeUtc.js +13 -5
  455. package/dist/utc/format/formatUtc.d.ts +7 -2
  456. package/dist/utc/format/formatUtc.js +4 -0
  457. package/dist/utc/format/index.d.ts +1 -1
  458. package/dist/utc/format/index.js +1 -1
  459. package/dist/utc/get/getUtcDay.d.ts +1 -3
  460. package/dist/utc/get/getUtcDay.js +5 -12
  461. package/dist/utc/get/getUtcHour.d.ts +1 -3
  462. package/dist/utc/get/getUtcHour.js +5 -12
  463. package/dist/utc/get/getUtcMicrosecond.d.ts +1 -3
  464. package/dist/utc/get/getUtcMicrosecond.js +4 -11
  465. package/dist/utc/get/getUtcMillisecond.d.ts +1 -3
  466. package/dist/utc/get/getUtcMillisecond.js +5 -12
  467. package/dist/utc/get/getUtcMinute.d.ts +1 -3
  468. package/dist/utc/get/getUtcMinute.js +5 -12
  469. package/dist/utc/get/getUtcMonth.d.ts +1 -3
  470. package/dist/utc/get/getUtcMonth.js +5 -12
  471. package/dist/utc/get/getUtcNanosecond.d.ts +1 -3
  472. package/dist/utc/get/getUtcNanosecond.js +4 -11
  473. package/dist/utc/get/getUtcNow.d.ts +1 -3
  474. package/dist/utc/get/getUtcNow.js +2 -9
  475. package/dist/utc/get/getUtcNowUnit.d.ts +2 -0
  476. package/dist/utc/get/getUtcNowUnit.js +2 -0
  477. package/dist/utc/get/getUtcSecond.d.ts +1 -3
  478. package/dist/utc/get/getUtcSecond.js +5 -12
  479. package/dist/utc/get/getUtcYear.d.ts +3 -3
  480. package/dist/utc/get/getUtcYear.js +5 -12
  481. package/dist/utc/interval/intervalXorAllUtc.js +2 -2
  482. package/dist/utc/interval/mergeIntervalsUtc.js +2 -2
  483. package/dist/utc/parse/index.d.ts +1 -1
  484. package/dist/utc/parse/index.js +1 -1
  485. package/dist/utc/parse/parseDateFromUtc.d.ts +4 -2
  486. package/dist/utc/parse/parseDateFromUtc.js +2 -2
  487. package/dist/utc/parse/parseDayFromUtc.d.ts +4 -2
  488. package/dist/utc/parse/parseDayFromUtc.js +2 -2
  489. package/dist/utc/parse/parseDayOfWeekFromUtc.d.ts +4 -2
  490. package/dist/utc/parse/parseDayOfWeekFromUtc.js +4 -4
  491. package/dist/utc/parse/parseHourFromUtc.d.ts +4 -2
  492. package/dist/utc/parse/parseHourFromUtc.js +2 -2
  493. package/dist/utc/parse/{parseHttp.d.ts → parseHttpDate.d.ts} +12 -12
  494. package/dist/utc/parse/{parseHttp.js → parseHttpDate.js} +12 -12
  495. package/dist/utc/parse/parseMicrosecondFromUtc.d.ts +4 -2
  496. package/dist/utc/parse/parseMicrosecondFromUtc.js +2 -2
  497. package/dist/utc/parse/parseMillisecondFromUtc.d.ts +4 -2
  498. package/dist/utc/parse/parseMillisecondFromUtc.js +2 -2
  499. package/dist/utc/parse/parseMinuteFromUtc.d.ts +4 -2
  500. package/dist/utc/parse/parseMinuteFromUtc.js +2 -2
  501. package/dist/utc/parse/parseMonthFromUtc.d.ts +4 -2
  502. package/dist/utc/parse/parseMonthFromUtc.js +2 -2
  503. package/dist/utc/parse/parseNanosecondFromUtc.d.ts +4 -2
  504. package/dist/utc/parse/parseNanosecondFromUtc.js +2 -2
  505. package/dist/utc/parse/parseSecondFromUtc.d.ts +4 -2
  506. package/dist/utc/parse/parseSecondFromUtc.js +2 -2
  507. package/dist/utc/parse/parseTimeFromUtc.d.ts +5 -2
  508. package/dist/utc/parse/parseTimeFromUtc.js +5 -4
  509. package/dist/utc/parse/parseUnitFromUtc.d.ts +10 -3
  510. package/dist/utc/parse/parseUnitFromUtc.js +11 -5
  511. package/dist/utc/parse/parseWeekFromUtc.d.ts +4 -2
  512. package/dist/utc/parse/parseWeekFromUtc.js +4 -4
  513. package/dist/utc/parse/parseYearFromUtc.d.ts +8 -4
  514. package/dist/utc/parse/parseYearFromUtc.js +8 -5
  515. package/dist/utc/validate/index.d.ts +2 -0
  516. package/dist/utc/validate/index.js +2 -0
  517. package/dist/utc/validate/isValidHttpDate.d.ts +35 -0
  518. package/dist/utc/validate/isValidHttpDate.js +38 -0
  519. package/dist/utc/validate/isValidUtc.d.ts +4 -0
  520. package/dist/utc/validate/isValidUtc.js +4 -0
  521. package/dist/utc/validate/isValidUtcTimestamp.d.ts +43 -0
  522. package/dist/utc/validate/isValidUtcTimestamp.js +48 -0
  523. package/dist/zoned/calculate/addZoned.js +4 -7
  524. package/dist/zoned/calculate/setZoned.d.ts +19 -5
  525. package/dist/zoned/calculate/setZoned.js +26 -9
  526. package/dist/zoned/calculate/subtractZoned.js +4 -7
  527. package/dist/zoned/convert/convertPlainDateTimeToZoned.d.ts +4 -1
  528. package/dist/zoned/convert/convertPlainDateTimeToZoned.js +4 -1
  529. package/dist/zoned/convert/convertZonedToZoned.d.ts +5 -1
  530. package/dist/zoned/convert/convertZonedToZoned.js +5 -1
  531. package/dist/zoned/format/formatCalendarZoned.js +2 -1
  532. package/dist/zoned/format/formatRelativeZoned.js +2 -1
  533. package/dist/zoned/format/formatTimeZoneName.d.ts +5 -1
  534. package/dist/zoned/format/formatTimeZoneName.js +5 -1
  535. package/dist/zoned/get/getDstTransitions.d.ts +5 -3
  536. package/dist/zoned/get/getDstTransitions.js +12 -7
  537. package/dist/zoned/get/getSystemTimeZone.d.ts +3 -1
  538. package/dist/zoned/get/getSystemTimeZone.js +5 -2
  539. package/dist/zoned/get/getTimeZoneOffset.d.ts +10 -2
  540. package/dist/zoned/get/getTimeZoneOffset.js +18 -5
  541. package/dist/zoned/get/getZonedDay.d.ts +2 -1
  542. package/dist/zoned/get/getZonedDay.js +6 -7
  543. package/dist/zoned/get/getZonedDayOfWeek.d.ts +2 -1
  544. package/dist/zoned/get/getZonedDayOfWeek.js +6 -5
  545. package/dist/zoned/get/getZonedHour.d.ts +2 -1
  546. package/dist/zoned/get/getZonedHour.js +6 -7
  547. package/dist/zoned/get/getZonedMicrosecond.d.ts +2 -1
  548. package/dist/zoned/get/getZonedMicrosecond.js +6 -5
  549. package/dist/zoned/get/getZonedMillisecond.d.ts +2 -1
  550. package/dist/zoned/get/getZonedMillisecond.js +6 -7
  551. package/dist/zoned/get/getZonedMinute.d.ts +2 -1
  552. package/dist/zoned/get/getZonedMinute.js +6 -7
  553. package/dist/zoned/get/getZonedMonth.d.ts +2 -1
  554. package/dist/zoned/get/getZonedMonth.js +6 -7
  555. package/dist/zoned/get/getZonedNanosecond.d.ts +2 -1
  556. package/dist/zoned/get/getZonedNanosecond.js +6 -5
  557. package/dist/zoned/get/getZonedNow.d.ts +5 -1
  558. package/dist/zoned/get/getZonedNow.js +5 -1
  559. package/dist/zoned/get/getZonedNowUnit.d.ts +6 -3
  560. package/dist/zoned/get/getZonedNowUnit.js +10 -7
  561. package/dist/zoned/get/getZonedSecond.d.ts +2 -1
  562. package/dist/zoned/get/getZonedSecond.js +6 -7
  563. package/dist/zoned/get/getZonedToday.d.ts +2 -1
  564. package/dist/zoned/get/getZonedToday.js +6 -5
  565. package/dist/zoned/get/getZonedWeekOfYear.d.ts +2 -1
  566. package/dist/zoned/get/getZonedWeekOfYear.js +6 -5
  567. package/dist/zoned/get/getZonedYear.d.ts +4 -1
  568. package/dist/zoned/get/getZonedYear.js +9 -7
  569. package/dist/zoned/interval/intervalXorAllZoned.js +2 -2
  570. package/dist/zoned/interval/mergeIntervalsZoned.js +2 -2
  571. package/dist/zoned/parse/parseUnitFromZoned.d.ts +4 -1
  572. package/dist/zoned/parse/parseUnitFromZoned.js +5 -1
  573. package/dist/zoned/parse/parseYearFromZoned.d.ts +4 -2
  574. package/dist/zoned/parse/parseYearFromZoned.js +6 -3
  575. package/dist/zoned/validate/hasDaylightSaving.d.ts +4 -2
  576. package/dist/zoned/validate/hasDaylightSaving.js +13 -7
  577. package/dist/zoned/validate/index.d.ts +2 -0
  578. package/dist/zoned/validate/index.js +2 -0
  579. package/dist/zoned/validate/isValidRfc2822DateTime.d.ts +32 -0
  580. package/dist/zoned/validate/isValidRfc2822DateTime.js +35 -0
  581. package/dist/zoned/validate/isValidRfc3339DateTime.d.ts +31 -0
  582. package/dist/zoned/validate/isValidRfc3339DateTime.js +34 -0
  583. package/dist/zoned/validate/isValidTimeZone.d.ts +5 -1
  584. package/dist/zoned/validate/isValidTimeZone.js +6 -2
  585. package/package.json +50 -1
  586. package/skills/gmt-arithmetic/SKILL.md +99 -12
  587. package/skills/gmt-basics/SKILL.md +57 -15
  588. package/skills/gmt-integration/SKILL.md +24 -9
  589. package/skills/gmt-timezone/SKILL.md +134 -29
  590. package/dist/internal/unixZonedDateTime.d.ts +0 -22
  591. package/dist/internal/unixZonedDateTime.js +0 -32
  592. package/dist/internal/utcZonedDateTime.d.ts +0 -19
  593. package/dist/internal/utcZonedDateTime.js +0 -31
@@ -10,10 +10,23 @@ import type { Disambiguation, Offset, Overflow } from "../../types/index.js";
10
10
  * equivalent to `.with()`'s, because Temporal's `ZonedDateTime.prototype.add()` doesn't accept
11
11
  * `disambiguation`/`offset` at all.
12
12
  * - `fields` may set any of `year`, `month`, `monthCode`, `day`, `hour`, `minute`, `second`,
13
- * `millisecond`, `microsecond`, `nanosecond`, `era`, and/or `eraYear`; omitted fields keep
14
- * their current value. An empty object is a no-op. `calendar`, `timeZone`, and `offset` are
15
- * deliberately excluded from `fields` — this function only sets date/time components, never
16
- * the zone or calendar identity, and `offset` is controlled separately via `options.offset`.
13
+ * `millisecond`, `microsecond` and/or `nanosecond`; omitted fields keep their current value. An
14
+ * object with no field set, such as `{}` or `{ year: undefined }`, is a no-op.
15
+ * - Values are not converted: `monthCode` must be a string and every other field an integer number.
16
+ * `null`, a numeric string, a boolean or a fraction returns "", where Temporal would convert or
17
+ * truncate it. A bigint, `NaN` or an infinity returns "" too. A number too large for its
18
+ * field follows `overflow`. A month or day below 1, or a date outside Temporal's range, returns
19
+ * "".
20
+ * - An own key that is not one of these fields, such as a misspelt `yaer`, returns "". So does an
21
+ * era, an `offset`, or a `calendar` or `timeZone` property, whether own, inherited or a getter. A
22
+ * field is read with a property get, as Temporal reads it, so an inherited or getter field is
23
+ * set.
24
+ * - A Temporal date or time object returns "", as Temporal's `with` refuses one. One whose
25
+ * prototype has been replaced with `Object.prototype`, `null` or `Function.prototype` sets
26
+ * nothing instead.
27
+ * - `calendar`, `timeZone`, and `offset` are deliberately excluded from `fields` — this function
28
+ * only sets date/time components, never the zone or calendar identity, and `offset` is
29
+ * controlled separately via `options.offset`.
17
30
  * - **Compatibility:** before 1.16.0 `offset` defaulted to `"ignore"`. Pass `{ offset: "ignore" }`
18
31
  * to keep that resolution.
19
32
  * - Returns "" for invalid input.
@@ -29,9 +42,10 @@ import type { Disambiguation, Offset, Overflow } from "../../types/index.js";
29
42
  * @example setZoned("2024-03-10T12:00:00-04:00[America/New_York]", {}) // "2024-03-10T12:00:00-04:00[America/New_York]" (empty fields object is a no-op)
30
43
  * @example setZoned("2024-11-03T01:45:00-05:00[America/New_York]", { minute: 0 }, { disambiguation: "reject" }) // "2024-11-03T01:00:00-05:00[America/New_York]" (offset defaults to "prefer": the source's -05:00 is still valid, so it is kept and "reject" never fires)
31
44
  * @example setZoned("2024-11-03T01:45:00-05:00[America/New_York]", { minute: 0 }, { disambiguation: "reject", offset: "ignore" }) // "" (offset "ignore" re-resolves the repeated 01:00, and "reject" throws)
45
+ * @example setZoned("2024-03-10T12:00:00-04:00[America/New_York]", { hour: "9" }) // "" (not converted)
32
46
  * @example setZoned("invalid", { hour: 9 }) // ""
33
47
  */
34
- export declare function setZoned(value: string, fields: Omit<Temporal.ZonedDateTimeLike, "calendar" | "timeZone" | "offset">, options?: {
48
+ export declare function setZoned(value: string, fields: Omit<Temporal.ZonedDateTimeLike, "calendar" | "timeZone" | "offset" | "era" | "eraYear">, options?: {
35
49
  /**
36
50
  * What happens when the result names a day its month does not have, such as setting `month: 2`
37
51
  * on 31 January. `"constrain"` clamps to the last valid day; `"reject"` returns `""`.
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
- import { resolveOverflow, withZonedFields, zonedDateTimeFrom, } from "../../internal/index.js";
2
+ import { DATE_TIME_FIELDS, readSetFields, resolveOverflow, withZonedFields, zonedDateTimeFrom, } from "../../internal/index.js";
3
3
  import { isValidZonedDateTime } from "../validate/index.js";
4
4
  import { isOptionsArgument } from "../../internal/isObject.js";
5
5
  import { optionOrDefault } from "../../internal/optionOrDefault.js";
@@ -13,10 +13,23 @@ import { optionOrDefault } from "../../internal/optionOrDefault.js";
13
13
  * equivalent to `.with()`'s, because Temporal's `ZonedDateTime.prototype.add()` doesn't accept
14
14
  * `disambiguation`/`offset` at all.
15
15
  * - `fields` may set any of `year`, `month`, `monthCode`, `day`, `hour`, `minute`, `second`,
16
- * `millisecond`, `microsecond`, `nanosecond`, `era`, and/or `eraYear`; omitted fields keep
17
- * their current value. An empty object is a no-op. `calendar`, `timeZone`, and `offset` are
18
- * deliberately excluded from `fields` — this function only sets date/time components, never
19
- * the zone or calendar identity, and `offset` is controlled separately via `options.offset`.
16
+ * `millisecond`, `microsecond` and/or `nanosecond`; omitted fields keep their current value. An
17
+ * object with no field set, such as `{}` or `{ year: undefined }`, is a no-op.
18
+ * - Values are not converted: `monthCode` must be a string and every other field an integer number.
19
+ * `null`, a numeric string, a boolean or a fraction returns "", where Temporal would convert or
20
+ * truncate it. A bigint, `NaN` or an infinity returns "" too. A number too large for its
21
+ * field follows `overflow`. A month or day below 1, or a date outside Temporal's range, returns
22
+ * "".
23
+ * - An own key that is not one of these fields, such as a misspelt `yaer`, returns "". So does an
24
+ * era, an `offset`, or a `calendar` or `timeZone` property, whether own, inherited or a getter. A
25
+ * field is read with a property get, as Temporal reads it, so an inherited or getter field is
26
+ * set.
27
+ * - A Temporal date or time object returns "", as Temporal's `with` refuses one. One whose
28
+ * prototype has been replaced with `Object.prototype`, `null` or `Function.prototype` sets
29
+ * nothing instead.
30
+ * - `calendar`, `timeZone`, and `offset` are deliberately excluded from `fields` — this function
31
+ * only sets date/time components, never the zone or calendar identity, and `offset` is
32
+ * controlled separately via `options.offset`.
20
33
  * - **Compatibility:** before 1.16.0 `offset` defaulted to `"ignore"`. Pass `{ offset: "ignore" }`
21
34
  * to keep that resolution.
22
35
  * - Returns "" for invalid input.
@@ -32,6 +45,7 @@ import { optionOrDefault } from "../../internal/optionOrDefault.js";
32
45
  * @example setZoned("2024-03-10T12:00:00-04:00[America/New_York]", {}) // "2024-03-10T12:00:00-04:00[America/New_York]" (empty fields object is a no-op)
33
46
  * @example setZoned("2024-11-03T01:45:00-05:00[America/New_York]", { minute: 0 }, { disambiguation: "reject" }) // "2024-11-03T01:00:00-05:00[America/New_York]" (offset defaults to "prefer": the source's -05:00 is still valid, so it is kept and "reject" never fires)
34
47
  * @example setZoned("2024-11-03T01:45:00-05:00[America/New_York]", { minute: 0 }, { disambiguation: "reject", offset: "ignore" }) // "" (offset "ignore" re-resolves the repeated 01:00, and "reject" throws)
48
+ * @example setZoned("2024-03-10T12:00:00-04:00[America/New_York]", { hour: "9" }) // "" (not converted)
35
49
  * @example setZoned("invalid", { hour: 9 }) // ""
36
50
  */
37
51
  export function setZoned(value, fields, options) {
@@ -47,11 +61,14 @@ export function setZoned(value, fields, options) {
47
61
  const offset = optionOrDefault(options?.offset, "prefer");
48
62
  try {
49
63
  const zoned = zonedDateTimeFrom(value);
50
- // Temporal.ZonedDateTime.prototype.with() throws on an empty fields object ("no supported
51
- // properties found") rather than treating it as a no-op, so short-circuit here.
52
- if (Object.keys(fields).length === 0)
64
+ const set = readSetFields(fields, DATE_TIME_FIELDS);
65
+ if (set === null)
66
+ return "";
67
+ // Only the values readSetFields checked reach Temporal, on both paths of withZonedFields. An
68
+ // empty result sets nothing: a no-op here, where Temporal's with() would throw.
69
+ if (Object.keys(set).length === 0)
53
70
  return zoned.toString();
54
- return withZonedFields(zoned, fields, {
71
+ return withZonedFields(zoned, set, {
55
72
  overflow,
56
73
  disambiguation,
57
74
  offset,
@@ -1,5 +1,5 @@
1
1
  // fallow-ignore-file code-duplication -- sibling variant keeps its own guard, parse and try/catch, by design
2
- import { addToZonedDisambiguated, calendarSystemOfZonedValue, formatZonedInCalendar, isValidAmount, parseCalendarZonedValue, resolveOverflow, } from "../../internal/index.js";
2
+ import { addToZonedDisambiguated, calendarSystemOfZonedValue, formatZonedInCalendar, parseCalendarZonedValue, readDurationUnits, resolveOverflow, } from "../../internal/index.js";
3
3
  import { isValidDateTimeDurationUnit } from "../../plain/validate/index.js";
4
4
  import { isValidCalendarZonedDateTime } from "../validate/index.js";
5
5
  import { isOptionsArgument } from "../../internal/isObject.js";
@@ -58,11 +58,8 @@ export function subtractZoned(value, units, optionsArg) {
58
58
  return "";
59
59
  }
60
60
  const validZonedDateTime = isValidCalendarZonedDateTime(value);
61
- const validUnits = typeof units === "object" &&
62
- units !== null &&
63
- Object.keys(units).every(isValidDateTimeDurationUnit);
64
- const validAmounts = validUnits && Object.values(units).every(isValidAmount);
65
- if (!validZonedDateTime || !validUnits || !validAmounts) {
61
+ const amounts = readDurationUnits(units, isValidDateTimeDurationUnit);
62
+ if (!validZonedDateTime || amounts === null) {
66
63
  return "";
67
64
  }
68
65
  const disambiguation = optionOrDefault(optionsArg?.disambiguation, "compatible");
@@ -73,7 +70,7 @@ export function subtractZoned(value, units, optionsArg) {
73
70
  return "";
74
71
  }
75
72
  const zoned = parseCalendarZonedValue(value);
76
- const subtracted = addToZonedDisambiguated(zoned, units, -1, {
73
+ const subtracted = addToZonedDisambiguated(zoned, amounts, -1, {
77
74
  overflow,
78
75
  disambiguation,
79
76
  });
@@ -9,9 +9,12 @@ import type { Disambiguation } from "../../types/index.js";
9
9
  * - **Output is cut to milliseconds by default**, so microseconds and nanoseconds in `value` are
10
10
  * dropped. Pass `{ smallestUnit: "nanoseconds" }` to keep every digit.
11
11
  * - Returns "" for invalid input.
12
+ * - An offset with seconds (`-00:44:30`) returns `""`. A written zone cannot carry seconds (RFC
13
+ * 9557 §4.1), so the result could not name it. Pass the IANA name, or call `resolveLocal` for the
14
+ * instant the wall time names at that offset.
12
15
  *
13
16
  * @param value plain datetime string (e.g. "2024-02-29T14:30:45")
14
- * @param timeZone IANA name or UTC offset
17
+ * @param timeZone IANA name or a UTC offset to the minute (what `isValidTimeZone` accepts)
15
18
  * @param optionsArg optional settings for the precision of the output string and for resolving a DST gap or overlap
16
19
  * @returns zoned ISO 8601 datetime string or "" when invalid
17
20
  *
@@ -13,9 +13,12 @@ import { optionOrDefault } from "../../internal/optionOrDefault.js";
13
13
  * - **Output is cut to milliseconds by default**, so microseconds and nanoseconds in `value` are
14
14
  * dropped. Pass `{ smallestUnit: "nanoseconds" }` to keep every digit.
15
15
  * - Returns "" for invalid input.
16
+ * - An offset with seconds (`-00:44:30`) returns `""`. A written zone cannot carry seconds (RFC
17
+ * 9557 §4.1), so the result could not name it. Pass the IANA name, or call `resolveLocal` for the
18
+ * instant the wall time names at that offset.
16
19
  *
17
20
  * @param value plain datetime string (e.g. "2024-02-29T14:30:45")
18
- * @param timeZone IANA name or UTC offset
21
+ * @param timeZone IANA name or a UTC offset to the minute (what `isValidTimeZone` accepts)
19
22
  * @param optionsArg optional settings for the precision of the output string and for resolving a DST gap or overlap
20
23
  * @returns zoned ISO 8601 datetime string or "" when invalid
21
24
  *
@@ -3,9 +3,13 @@
3
3
  *
4
4
  * - Uses Temporal.ZonedDateTime.withTimeZone to convert.
5
5
  * - Returns "" for invalid input.
6
+ * - An offset with seconds (`-00:44:30`) returns `""`. A written zone cannot carry seconds (RFC
7
+ * 9557 §4.1), so the result could not name it. Pass the IANA name, or call
8
+ * `fromOffsetInstant({ instant, offset })` for the local time with its full offset and no
9
+ * bracket.
6
10
  *
7
11
  * @param value zoned ISO 8601 datetime string
8
- * @param timeZone target IANA name or UTC offset
12
+ * @param timeZone target IANA name or a UTC offset to the minute (what `isValidTimeZone` accepts)
9
13
  * @returns zoned ISO 8601 string in target timeZone or "" when invalid
10
14
  *
11
15
  * @example convertZonedToZoned("2024-02-29T12:34:56.789+00:00[UTC]", "America/New_York") // "2024-02-29T07:34:56.789-05:00[America/New_York]"
@@ -5,9 +5,13 @@ import { zonedDateTimeFrom } from "../../internal/index.js";
5
5
  *
6
6
  * - Uses Temporal.ZonedDateTime.withTimeZone to convert.
7
7
  * - Returns "" for invalid input.
8
+ * - An offset with seconds (`-00:44:30`) returns `""`. A written zone cannot carry seconds (RFC
9
+ * 9557 §4.1), so the result could not name it. Pass the IANA name, or call
10
+ * `fromOffsetInstant({ instant, offset })` for the local time with its full offset and no
11
+ * bracket.
8
12
  *
9
13
  * @param value zoned ISO 8601 datetime string
10
- * @param timeZone target IANA name or UTC offset
14
+ * @param timeZone target IANA name or a UTC offset to the minute (what `isValidTimeZone` accepts)
11
15
  * @returns zoned ISO 8601 string in target timeZone or "" when invalid
12
16
  *
13
17
  * @example convertZonedToZoned("2024-02-29T12:34:56.789+00:00[UTC]", "America/New_York") // "2024-02-29T07:34:56.789-05:00[America/New_York]"
@@ -5,6 +5,7 @@ import { isValidUtc } from "../../utc/validate/index.js";
5
5
  import { isValidZonedFormatReference } from "../../internal/zonedFormatReference.js";
6
6
  import { isValidZonedDateTime } from "../validate/index.js";
7
7
  import { optionOrDefault } from "../../internal/optionOrDefault.js";
8
+ import { isObject } from "../../internal/isObject.js";
8
9
  /**
9
10
  * Format a zoned date-time as a relative day label plus time-of-day, e.g.
10
11
  * "Tomorrow at 2:30 PM" — the zoned counterpart of `formatCalendar`. See
@@ -29,7 +30,7 @@ export function formatCalendarZoned(value, locale, options = {}) {
29
30
  try {
30
31
  // Temporal GetOptionsObject: options must be an object or omitted; null and other primitives are
31
32
  // invalid input.
32
- if (options === null || typeof options !== "object")
33
+ if (!isObject(options))
33
34
  return "";
34
35
  if (!isValidZonedDateTime(value))
35
36
  return "";
@@ -4,6 +4,7 @@ import { formatRelativeDuration } from "../../internal/formatRelativeDuration.js
4
4
  import { isValidUtc } from "../../utc/validate/index.js";
5
5
  import { isValidZonedFormatReference } from "../../internal/zonedFormatReference.js";
6
6
  import { isValidZonedDateTime } from "../validate/index.js";
7
+ import { isObject } from "../../internal/isObject.js";
7
8
  /**
8
9
  * Format the relative time between a zoned date-time and a reference instant.
9
10
  *
@@ -34,7 +35,7 @@ export function formatRelativeZoned(value, locale, options = {}) {
34
35
  try {
35
36
  // Temporal GetOptionsObject: options must be an object or omitted; null and other primitives are
36
37
  // invalid input.
37
- if (options === null || typeof options !== "object")
38
+ if (!isObject(options))
38
39
  return "";
39
40
  if (!isValidZonedDateTime(value))
40
41
  return "";
@@ -47,8 +47,12 @@ export interface FormatTimeZoneNameOptions {
47
47
  * issue — prefer them for a name that won't change twice a year.
48
48
  * - Output depends on runtime ICU data.
49
49
  * - Returns "" for an invalid timeZone or locale.
50
+ * - An offset with seconds (`-00:44:30`) returns `""`. `Intl.DateTimeFormat` takes a time zone
51
+ * identifier only: constructing one with an offset that has seconds throws (ECMA-402, the
52
+ * `DateTimeFormat` construction step "If parseResult contains more than one MinuteSecond Parse
53
+ * Node, throw a RangeError exception"). Pass the IANA name.
50
54
  *
51
- * @param timeZone IANA name or UTC offset
55
+ * @param timeZone IANA name or a UTC offset to the minute (what `isValidTimeZone` accepts)
52
56
  * @param locale BCP 47 locale tag (e.g. "en-US"), or a preference list of tags (ECMA-402; the first with locale data is read). Required: omitted, or an empty list (which ECMA-402 would resolve to the host default), returns ""
53
57
  * @param options optional setting for the form of the name
54
58
  * @returns localized zone name, or "" on invalid input
@@ -20,8 +20,12 @@ import { optionOrDefault } from "../../internal/optionOrDefault.js";
20
20
  * issue — prefer them for a name that won't change twice a year.
21
21
  * - Output depends on runtime ICU data.
22
22
  * - Returns "" for an invalid timeZone or locale.
23
+ * - An offset with seconds (`-00:44:30`) returns `""`. `Intl.DateTimeFormat` takes a time zone
24
+ * identifier only: constructing one with an offset that has seconds throws (ECMA-402, the
25
+ * `DateTimeFormat` construction step "If parseResult contains more than one MinuteSecond Parse
26
+ * Node, throw a RangeError exception"). Pass the IANA name.
23
27
  *
24
- * @param timeZone IANA name or UTC offset
28
+ * @param timeZone IANA name or a UTC offset to the minute (what `isValidTimeZone` accepts)
25
29
  * @param locale BCP 47 locale tag (e.g. "en-US"), or a preference list of tags (ECMA-402; the first with locale data is read). Required: omitted, or an empty list (which ECMA-402 would resolve to the host default), returns ""
26
30
  * @param options optional setting for the form of the name
27
31
  * @returns localized zone name, or "" on invalid input
@@ -35,10 +35,11 @@ export interface DstTransition {
35
35
  * - Returns `[]` for an invalid timeZone, a non-integer year, or a valid zone
36
36
  * with zero transitions in that year (not an error case), and when the scan
37
37
  * exhausts its internal bound — never a partial list.
38
- * - A UTC offset such as `"+05:30"` is a valid zone whose offset never changes,
39
- * so it has no transitions and returns `[]` for every year.
38
+ * - A UTC offset, with or without seconds (`"+05:30"`, `"-00:44:30"`), never changes, so it has no
39
+ * transitions and returns `[]` for every year.
40
40
  *
41
- * @param timeZone IANA name or UTC offset
41
+ * @param timeZone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or a
42
+ * stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
42
43
  * @param year calendar year to scan (must be an integer)
43
44
  * @returns array of `{ instant, offsetBefore, offsetAfter }`, in chronological order
44
45
  *
@@ -52,5 +53,6 @@ export interface DstTransition {
52
53
  * @example getDstTransitions("Asia/Tokyo", 2024) // []
53
54
  * @example getDstTransitions("+05:30", 2024) // [] (a fixed offset has no transitions)
54
55
  * @example getDstTransitions("Invalid/Zone", 2024) // []
56
+ * @example getDstTransitions("-00:44:30", 1970) // [] (a fixed offset)
55
57
  */
56
58
  export declare function getDstTransitions(timeZone: string, year: number): DstTransition[];
@@ -1,5 +1,4 @@
1
- import { isValidTimeZone } from "../validate/index.js";
2
- import { zonedDateTimeFrom, zonedNextTransition, zonedStartOfDay, } from "../../internal/index.js";
1
+ import { zonedDateTimeFrom, zonedNextTransition, zonedStartOfDay, zoneFrame, } from "../../internal/index.js";
3
2
  const MAX_TRANSITIONS_PER_YEAR = 20;
4
3
  /** 368 days: a 366-day year plus a day at each end for the zone's offset. */
5
4
  const SEARCH_SPAN_NANOSECONDS = 368n * 86400000000000n;
@@ -20,10 +19,11 @@ const SEARCH_SPAN_NANOSECONDS = 368n * 86400000000000n;
20
19
  * - Returns `[]` for an invalid timeZone, a non-integer year, or a valid zone
21
20
  * with zero transitions in that year (not an error case), and when the scan
22
21
  * exhausts its internal bound — never a partial list.
23
- * - A UTC offset such as `"+05:30"` is a valid zone whose offset never changes,
24
- * so it has no transitions and returns `[]` for every year.
22
+ * - A UTC offset, with or without seconds (`"+05:30"`, `"-00:44:30"`), never changes, so it has no
23
+ * transitions and returns `[]` for every year.
25
24
  *
26
- * @param timeZone IANA name or UTC offset
25
+ * @param timeZone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or a
26
+ * stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
27
27
  * @param year calendar year to scan (must be an integer)
28
28
  * @returns array of `{ instant, offsetBefore, offsetAfter }`, in chronological order
29
29
  *
@@ -37,15 +37,20 @@ const SEARCH_SPAN_NANOSECONDS = 368n * 86400000000000n;
37
37
  * @example getDstTransitions("Asia/Tokyo", 2024) // []
38
38
  * @example getDstTransitions("+05:30", 2024) // [] (a fixed offset has no transitions)
39
39
  * @example getDstTransitions("Invalid/Zone", 2024) // []
40
+ * @example getDstTransitions("-00:44:30", 1970) // [] (a fixed offset)
40
41
  */
41
42
  export function getDstTransitions(timeZone, year) {
42
- if (!isValidTimeZone(timeZone) || !Number.isInteger(year)) {
43
+ const frame = zoneFrame(timeZone);
44
+ // A stored offset with seconds is a fixed offset: it has no transitions, as "-00:45" has none.
45
+ if (frame === null ||
46
+ frame.shiftNanoseconds !== 0n ||
47
+ !Number.isInteger(year)) {
43
48
  return [];
44
49
  }
45
50
  try {
46
51
  // getTimeZoneTransition("next") is strictly after its receiver, so start 1ns before the
47
52
  // year opens to catch a transition landing exactly on local January 1 00:00.
48
- let cur = zonedStartOfDay(zonedDateTimeFrom({ year, month: 1, day: 1, timeZone })).subtract({ nanoseconds: 1 });
53
+ let cur = zonedStartOfDay(zonedDateTimeFrom({ year, month: 1, day: 1, timeZone: frame.timeZone })).subtract({ nanoseconds: 1 });
49
54
  // A calendar year is at most 366 days and an offset is under a day, so no search needs to
50
55
  // read past this.
51
56
  const searchEnd = cur.epochNanoseconds + SEARCH_SPAN_NANOSECONDS;
@@ -2,7 +2,9 @@
2
2
  * Return the runtime system timeZone name (for example "America/New_York").
3
3
  *
4
4
  * - Uses Intl.DateTimeFormat().resolvedOptions().timeZone to get system timezone.
5
- * - Returns "" when timezone is unavailable.
5
+ * - Returns "" when the host reports no usable time zone. With an empty `TZ` the runtime reports
6
+ * ICU's placeholder `"Etc/Unknown"`, and with an unrecognised `TZ` it reports `undefined`;
7
+ * neither is a zone that Temporal or `Intl.DateTimeFormat` accepts.
6
8
  *
7
9
  * @returns system timeZone name or "" on failure
8
10
  *
@@ -1,8 +1,11 @@
1
+ import { isValidTimeZone } from "../validate/isValidTimeZone.js";
1
2
  /**
2
3
  * Return the runtime system timeZone name (for example "America/New_York").
3
4
  *
4
5
  * - Uses Intl.DateTimeFormat().resolvedOptions().timeZone to get system timezone.
5
- * - Returns "" when timezone is unavailable.
6
+ * - Returns "" when the host reports no usable time zone. With an empty `TZ` the runtime reports
7
+ * ICU's placeholder `"Etc/Unknown"`, and with an unrecognised `TZ` it reports `undefined`;
8
+ * neither is a zone that Temporal or `Intl.DateTimeFormat` accepts.
6
9
  *
7
10
  * @returns system timeZone name or "" on failure
8
11
  *
@@ -11,7 +14,7 @@
11
14
  export function getSystemTimeZone() {
12
15
  try {
13
16
  const systemTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
14
- return systemTimeZone || "";
17
+ return isValidTimeZone(systemTimeZone) ? systemTimeZone : "";
15
18
  }
16
19
  catch {
17
20
  return "";
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Return an IANA timeZone's UTC offset at a given instant.
2
+ * Return a time zone's UTC offset at a given instant.
3
3
  *
4
4
  * - Unlike `getZonedOffset`, this doesn't need an existing zoned value in
5
5
  * hand — pass any timeZone identifier and an instant to look up, which is
@@ -17,14 +17,22 @@
17
17
  * - Only the instant is read from `instant`, as `isValidInstant` describes it: a bracketed zone
18
18
  * in it is not validated, and an offset written to the minute that is that zone's sub-minute
19
19
  * offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives.
20
+ * - The result is `±HH:MM`, or `±HH:MM:SS` where the zone was not on a whole minute
21
+ * (`Africa/Monrovia` stood at `-00:44:30` until 1972). It goes straight into the time zone
22
+ * position of any function whose result has no zone in it, and of this one: a UTC offset is its
23
+ * own answer at every instant, written without seconds when they are zero.
20
24
  *
21
- * @param timeZone IANA name or UTC offset
25
+ * @param timeZone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or a
26
+ * stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
22
27
  * @param instant ISO 8601 instant string (e.g. "2024-07-15T12:00:00Z")
23
28
  * @returns offset string (e.g. "-04:00"), or "" on invalid input
24
29
  *
25
30
  * @example getTimeZoneOffset("America/New_York", "2024-07-15T12:00:00Z") // "-04:00"
26
31
  * @example getTimeZoneOffset("America/New_York", "2024-01-15T12:00:00Z") // "-05:00"
27
32
  * @example getTimeZoneOffset("Asia/Kathmandu", "2024-01-15T12:00:00Z") // "+05:45"
33
+ * @example getTimeZoneOffset("Africa/Monrovia", "1970-01-01T12:00:00Z") // "-00:44:30" (an offset with seconds)
34
+ * @example getTimeZoneOffset("-00:44:30", "1970-01-01T12:00:00Z") // "-00:44:30" (its own result, read back)
35
+ * @example getTimeZoneOffset("+05:30:00", "1970-01-01T12:00:00Z") // "+05:30"
28
36
  * @example getTimeZoneOffset("Invalid/Zone", "2024-07-15T12:00:00Z") // ""
29
37
  * @example getTimeZoneOffset("America/New_York", "not an instant") // ""
30
38
  * @example getTimeZoneOffset("America/New_York", "2024-07-15T16:00:00z") // "" (lower-case z)
@@ -1,9 +1,9 @@
1
1
  import { instantFrom } from "../../internal/instantNanoseconds.js";
2
2
  import { hasInstantShape } from "../../internal/isoStringBody.js";
3
3
  import { instantLeapSecond } from "../../regex/index.js";
4
- import { isValidTimeZone } from "../validate/index.js";
4
+ import { frameOffset, zoneFrame } from "../../internal/zoneFrame.js";
5
5
  /**
6
- * Return an IANA timeZone's UTC offset at a given instant.
6
+ * Return a time zone's UTC offset at a given instant.
7
7
  *
8
8
  * - Unlike `getZonedOffset`, this doesn't need an existing zoned value in
9
9
  * hand — pass any timeZone identifier and an instant to look up, which is
@@ -21,14 +21,22 @@ import { isValidTimeZone } from "../validate/index.js";
21
21
  * - Only the instant is read from `instant`, as `isValidInstant` describes it: a bracketed zone
22
22
  * in it is not validated, and an offset written to the minute that is that zone's sub-minute
23
23
  * offset rounded (`-00:45[Africa/Monrovia]`, for −00:44:30) names the instant the zone gives.
24
+ * - The result is `±HH:MM`, or `±HH:MM:SS` where the zone was not on a whole minute
25
+ * (`Africa/Monrovia` stood at `-00:44:30` until 1972). It goes straight into the time zone
26
+ * position of any function whose result has no zone in it, and of this one: a UTC offset is its
27
+ * own answer at every instant, written without seconds when they are zero.
24
28
  *
25
- * @param timeZone IANA name or UTC offset
29
+ * @param timeZone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or a
30
+ * stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
26
31
  * @param instant ISO 8601 instant string (e.g. "2024-07-15T12:00:00Z")
27
32
  * @returns offset string (e.g. "-04:00"), or "" on invalid input
28
33
  *
29
34
  * @example getTimeZoneOffset("America/New_York", "2024-07-15T12:00:00Z") // "-04:00"
30
35
  * @example getTimeZoneOffset("America/New_York", "2024-01-15T12:00:00Z") // "-05:00"
31
36
  * @example getTimeZoneOffset("Asia/Kathmandu", "2024-01-15T12:00:00Z") // "+05:45"
37
+ * @example getTimeZoneOffset("Africa/Monrovia", "1970-01-01T12:00:00Z") // "-00:44:30" (an offset with seconds)
38
+ * @example getTimeZoneOffset("-00:44:30", "1970-01-01T12:00:00Z") // "-00:44:30" (its own result, read back)
39
+ * @example getTimeZoneOffset("+05:30:00", "1970-01-01T12:00:00Z") // "+05:30"
32
40
  * @example getTimeZoneOffset("Invalid/Zone", "2024-07-15T12:00:00Z") // ""
33
41
  * @example getTimeZoneOffset("America/New_York", "not an instant") // ""
34
42
  * @example getTimeZoneOffset("America/New_York", "2024-07-15T16:00:00z") // "" (lower-case z)
@@ -39,13 +47,18 @@ export function getTimeZoneOffset(timeZone, instant) {
39
47
  if (typeof instant !== "string") {
40
48
  return "";
41
49
  }
42
- if (!isValidTimeZone(timeZone) ||
50
+ const frame = zoneFrame(timeZone);
51
+ if (frame === null ||
43
52
  instantLeapSecond.test(instant) ||
44
53
  !hasInstantShape(instant)) {
45
54
  return "";
46
55
  }
47
56
  try {
48
- return instantFrom(instant).toZonedDateTimeISO(timeZone).offset;
57
+ const at = instantFrom(instant);
58
+ // A stored offset with seconds is its own answer at every valid instant.
59
+ return frame.shiftNanoseconds !== 0n
60
+ ? frameOffset(frame)
61
+ : at.toZonedDateTimeISO(frame.timeZone).offset;
49
62
  }
50
63
  catch {
51
64
  return "";
@@ -4,7 +4,8 @@
4
4
  * - Uses Temporal.Now.zonedDateTimeISO to get the current time.
5
5
  * - Validation is performed on the timezone.
6
6
  *
7
- * @param ianaTimezone IANA timeZone identifier
7
+ * @param ianaTimezone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or
8
+ * a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
8
9
  * @returns current day string (zero-padded to 2 digits) or "" on invalid input
9
10
  *
10
11
  * @example getZonedDay("America/New_York") // "28"
@@ -1,24 +1,23 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
- import { isValidTimeZone } from "../validate/index.js";
1
+ import { frameNowWallClock, zoneFrame } from "../../internal/zoneFrame.js";
3
2
  /**
4
3
  * Return the current day of month for the specified IANA timeZone.
5
4
  *
6
5
  * - Uses Temporal.Now.zonedDateTimeISO to get the current time.
7
6
  * - Validation is performed on the timezone.
8
7
  *
9
- * @param ianaTimezone IANA timeZone identifier
8
+ * @param ianaTimezone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or
9
+ * a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
10
10
  * @returns current day string (zero-padded to 2 digits) or "" on invalid input
11
11
  *
12
12
  * @example getZonedDay("America/New_York") // "28"
13
13
  * @example getZonedDay("invalid") // ""
14
14
  */
15
15
  export function getZonedDay(ianaTimezone) {
16
- if (!isValidTimeZone(ianaTimezone))
16
+ const frame = zoneFrame(ianaTimezone);
17
+ if (frame === null)
17
18
  return "";
18
19
  try {
19
- return Temporal.Now.zonedDateTimeISO(ianaTimezone)
20
- .day.toString()
21
- .padStart(2, "0");
20
+ return frameNowWallClock(frame).day.toString().padStart(2, "0");
22
21
  }
23
22
  catch {
24
23
  return "";
@@ -5,7 +5,8 @@
5
5
  * - Returns 1-7 (Monday=1 through Sunday=7).
6
6
  * - Validation is performed on the timezone.
7
7
  *
8
- * @param ianaTimezone IANA timeZone identifier
8
+ * @param ianaTimezone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or
9
+ * a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
9
10
  * @returns current day of week number (1-7) or null on invalid input
10
11
  *
11
12
  * @example getZonedDayOfWeek("America/New_York") // 3
@@ -1,5 +1,4 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
- import { isValidTimeZone } from "../validate/index.js";
1
+ import { frameNowWallClock, zoneFrame } from "../../internal/zoneFrame.js";
3
2
  /**
4
3
  * Return the current day of week for the specified IANA timeZone.
5
4
  *
@@ -7,17 +6,19 @@ import { isValidTimeZone } from "../validate/index.js";
7
6
  * - Returns 1-7 (Monday=1 through Sunday=7).
8
7
  * - Validation is performed on the timezone.
9
8
  *
10
- * @param ianaTimezone IANA timeZone identifier
9
+ * @param ianaTimezone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or
10
+ * a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
11
11
  * @returns current day of week number (1-7) or null on invalid input
12
12
  *
13
13
  * @example getZonedDayOfWeek("America/New_York") // 3
14
14
  * @example getZonedDayOfWeek("invalid") // null
15
15
  */
16
16
  export function getZonedDayOfWeek(ianaTimezone) {
17
- if (!isValidTimeZone(ianaTimezone))
17
+ const frame = zoneFrame(ianaTimezone);
18
+ if (frame === null)
18
19
  return null;
19
20
  try {
20
- const now = Temporal.Now.zonedDateTimeISO(ianaTimezone);
21
+ const now = frameNowWallClock(frame);
21
22
  return now.dayOfWeek;
22
23
  }
23
24
  catch {
@@ -4,7 +4,8 @@
4
4
  * - Uses Temporal.Now.zonedDateTimeISO to get the current time.
5
5
  * - Validation is performed on the timezone.
6
6
  *
7
- * @param ianaTimezone IANA timeZone identifier
7
+ * @param ianaTimezone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or
8
+ * a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
8
9
  * @returns current hour string (zero-padded to 2 digits) or "" on invalid input
9
10
  *
10
11
  * @example getZonedHour("America/New_York") // "19"
@@ -1,24 +1,23 @@
1
- import { Temporal } from "@js-temporal/polyfill";
2
- import { isValidTimeZone } from "../validate/index.js";
1
+ import { frameNowWallClock, zoneFrame } from "../../internal/zoneFrame.js";
3
2
  /**
4
3
  * Return the current hour for the specified IANA timeZone.
5
4
  *
6
5
  * - Uses Temporal.Now.zonedDateTimeISO to get the current time.
7
6
  * - Validation is performed on the timezone.
8
7
  *
9
- * @param ianaTimezone IANA timeZone identifier
8
+ * @param ianaTimezone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or
9
+ * a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
10
10
  * @returns current hour string (zero-padded to 2 digits) or "" on invalid input
11
11
  *
12
12
  * @example getZonedHour("America/New_York") // "19"
13
13
  * @example getZonedHour("invalid") // ""
14
14
  */
15
15
  export function getZonedHour(ianaTimezone) {
16
- if (!isValidTimeZone(ianaTimezone))
16
+ const frame = zoneFrame(ianaTimezone);
17
+ if (frame === null)
17
18
  return "";
18
19
  try {
19
- return Temporal.Now.zonedDateTimeISO(ianaTimezone)
20
- .hour.toString()
21
- .padStart(2, "0");
20
+ return frameNowWallClock(frame).hour.toString().padStart(2, "0");
22
21
  }
23
22
  catch {
24
23
  return "";
@@ -4,7 +4,8 @@
4
4
  * - Uses Temporal.Now.zonedDateTimeISO to get the current time.
5
5
  * - Validation is performed on the timezone.
6
6
  *
7
- * @param ianaTimezone IANA timeZone identifier
7
+ * @param ianaTimezone IANA name or UTC offset: a time zone identifier (`+05:30`, `+0530`, `-08`) or
8
+ * a stored offset (`±HH:MM[:SS]`, what `getTimeZoneOffset` returns)
8
9
  * @returns current microsecond string (zero-padded to 3 digits) or "" on invalid input
9
10
  *
10
11
  * @example getZonedMicrosecond("America/New_York") // "000"