@formkit/tempo 0.0.19 → 0.1.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 (177) hide show
  1. package/dist/addDay.d.ts +9 -0
  2. package/dist/addDay.mjs +11 -0
  3. package/dist/addDay.mjs.map +1 -0
  4. package/dist/addHour.d.ts +9 -0
  5. package/dist/addHour.mjs +11 -0
  6. package/dist/addHour.mjs.map +1 -0
  7. package/dist/addMinute.d.ts +9 -0
  8. package/dist/addMinute.mjs +11 -0
  9. package/dist/addMinute.mjs.map +1 -0
  10. package/dist/addMonth.d.ts +13 -0
  11. package/dist/addMonth.mjs +19 -0
  12. package/dist/addMonth.mjs.map +1 -0
  13. package/dist/addSecond.d.ts +9 -0
  14. package/dist/addSecond.mjs +11 -0
  15. package/dist/addSecond.mjs.map +1 -0
  16. package/dist/addYear.d.ts +13 -0
  17. package/dist/addYear.mjs +19 -0
  18. package/dist/addYear.mjs.map +1 -0
  19. package/dist/ap.d.ts +8 -0
  20. package/dist/ap.mjs +28 -0
  21. package/dist/ap.mjs.map +1 -0
  22. package/dist/applyOffset.d.ts +11 -0
  23. package/dist/applyOffset.mjs +20 -0
  24. package/dist/applyOffset.mjs.map +1 -0
  25. package/dist/bundle.mjs +1215 -0
  26. package/dist/bundle.mjs.map +1 -0
  27. package/dist/common.d.ts +137 -0
  28. package/dist/common.mjs +252 -0
  29. package/dist/common.mjs.map +1 -0
  30. package/dist/date.d.ts +9 -0
  31. package/dist/date.mjs +28 -0
  32. package/dist/date.mjs.map +1 -0
  33. package/dist/dayEnd.d.ts +9 -0
  34. package/dist/dayEnd.mjs +11 -0
  35. package/dist/dayEnd.mjs.map +1 -0
  36. package/dist/dayOfYear.d.ts +10 -0
  37. package/dist/dayOfYear.mjs +12 -0
  38. package/dist/dayOfYear.mjs.map +1 -0
  39. package/dist/dayStart.d.ts +9 -0
  40. package/dist/dayStart.mjs +11 -0
  41. package/dist/dayStart.mjs.map +1 -0
  42. package/dist/deviceLocale.d.ts +7 -0
  43. package/dist/deviceLocale.mjs +8 -0
  44. package/dist/deviceLocale.mjs.map +1 -0
  45. package/dist/deviceTZ.d.ts +8 -0
  46. package/dist/deviceTZ.mjs +8 -0
  47. package/dist/deviceTZ.mjs.map +1 -0
  48. package/dist/diffDays.d.ts +12 -0
  49. package/dist/diffDays.mjs +14 -0
  50. package/dist/diffDays.mjs.map +1 -0
  51. package/dist/diffHours.d.ts +12 -0
  52. package/dist/diffHours.mjs +14 -0
  53. package/dist/diffHours.mjs.map +1 -0
  54. package/dist/diffMilliseconds.d.ts +10 -0
  55. package/dist/diffMilliseconds.mjs +11 -0
  56. package/dist/diffMilliseconds.mjs.map +1 -0
  57. package/dist/diffMinutes.d.ts +11 -0
  58. package/dist/diffMinutes.mjs +10 -0
  59. package/dist/diffMinutes.mjs.map +1 -0
  60. package/dist/diffMonths.d.ts +10 -0
  61. package/dist/diffMonths.mjs +25 -0
  62. package/dist/diffMonths.mjs.map +1 -0
  63. package/dist/diffRound.d.ts +9 -0
  64. package/dist/diffRound.mjs +9 -0
  65. package/dist/diffRound.mjs.map +1 -0
  66. package/dist/diffSeconds.d.ts +12 -0
  67. package/dist/diffSeconds.mjs +10 -0
  68. package/dist/diffSeconds.mjs.map +1 -0
  69. package/dist/diffWeeks.d.ts +12 -0
  70. package/dist/diffWeeks.mjs +14 -0
  71. package/dist/diffWeeks.mjs.map +1 -0
  72. package/dist/diffYears.d.ts +10 -0
  73. package/dist/diffYears.mjs +10 -0
  74. package/dist/diffYears.mjs.map +1 -0
  75. package/dist/format.d.ts +36 -0
  76. package/dist/format.mjs +48 -0
  77. package/dist/format.mjs.map +1 -0
  78. package/dist/formatStr.d.ts +13 -0
  79. package/dist/formatStr.mjs +13 -0
  80. package/dist/formatStr.mjs.map +1 -0
  81. package/dist/fourDigitYear.d.ts +10 -0
  82. package/dist/fourDigitYear.mjs +12 -0
  83. package/dist/fourDigitYear.mjs.map +1 -0
  84. package/dist/hourEnd.d.ts +9 -0
  85. package/dist/hourEnd.mjs +11 -0
  86. package/dist/hourEnd.mjs.map +1 -0
  87. package/dist/hourStart.d.ts +9 -0
  88. package/dist/hourStart.mjs +11 -0
  89. package/dist/hourStart.mjs.map +1 -0
  90. package/dist/index.cjs +139 -20
  91. package/dist/index.cjs.map +1 -1
  92. package/dist/index.d.cts +75 -4
  93. package/dist/index.d.ts +54 -498
  94. package/dist/index.mjs +62 -1057
  95. package/dist/index.mjs.map +1 -1
  96. package/dist/isAfter.d.ts +18 -0
  97. package/dist/isAfter.mjs +11 -0
  98. package/dist/isAfter.mjs.map +1 -0
  99. package/dist/isBefore.d.ts +13 -0
  100. package/dist/isBefore.mjs +11 -0
  101. package/dist/isBefore.mjs.map +1 -0
  102. package/dist/isEqual.d.ts +13 -0
  103. package/dist/isEqual.mjs +11 -0
  104. package/dist/isEqual.mjs.map +1 -0
  105. package/dist/iso8601.d.ts +13 -0
  106. package/dist/iso8601.mjs +27 -0
  107. package/dist/iso8601.mjs.map +1 -0
  108. package/dist/minuteEnd.d.ts +9 -0
  109. package/dist/minuteEnd.mjs +11 -0
  110. package/dist/minuteEnd.mjs.map +1 -0
  111. package/dist/minuteStart.d.ts +9 -0
  112. package/dist/minuteStart.mjs +11 -0
  113. package/dist/minuteStart.mjs.map +1 -0
  114. package/dist/monthDays.d.ts +9 -0
  115. package/dist/monthDays.mjs +10 -0
  116. package/dist/monthDays.mjs.map +1 -0
  117. package/dist/monthEnd.d.ts +10 -0
  118. package/dist/monthEnd.mjs +13 -0
  119. package/dist/monthEnd.mjs.map +1 -0
  120. package/dist/monthStart.d.ts +9 -0
  121. package/dist/monthStart.mjs +12 -0
  122. package/dist/monthStart.mjs.map +1 -0
  123. package/dist/nearestDay.d.ts +12 -0
  124. package/dist/nearestDay.mjs +46 -0
  125. package/dist/nearestDay.mjs.map +1 -0
  126. package/dist/offset.d.ts +14 -0
  127. package/dist/offset.mjs +36 -0
  128. package/dist/offset.mjs.map +1 -0
  129. package/dist/parse.d.ts +13 -0
  130. package/dist/parse.mjs +163 -0
  131. package/dist/parse.mjs.map +1 -0
  132. package/dist/parts.d.ts +12 -0
  133. package/dist/parts.mjs +214 -0
  134. package/dist/parts.mjs.map +1 -0
  135. package/dist/range.d.ts +10 -0
  136. package/dist/range.mjs +50 -0
  137. package/dist/range.mjs.map +1 -0
  138. package/dist/removeOffset.d.ts +10 -0
  139. package/dist/removeOffset.mjs +13 -0
  140. package/dist/removeOffset.mjs.map +1 -0
  141. package/dist/sameDay.d.ts +10 -0
  142. package/dist/sameDay.mjs +11 -0
  143. package/dist/sameDay.mjs.map +1 -0
  144. package/dist/sameHour.d.ts +10 -0
  145. package/dist/sameHour.mjs +11 -0
  146. package/dist/sameHour.mjs.map +1 -0
  147. package/dist/sameMinute.d.ts +10 -0
  148. package/dist/sameMinute.mjs +11 -0
  149. package/dist/sameMinute.mjs.map +1 -0
  150. package/dist/sameSecond.d.ts +10 -0
  151. package/dist/sameSecond.mjs +11 -0
  152. package/dist/sameSecond.mjs.map +1 -0
  153. package/dist/sameYear.d.ts +10 -0
  154. package/dist/sameYear.mjs +11 -0
  155. package/dist/sameYear.mjs.map +1 -0
  156. package/dist/types.d.ts +143 -0
  157. package/dist/types.mjs +1 -0
  158. package/dist/types.mjs.map +1 -0
  159. package/dist/tzDate.d.ts +15 -0
  160. package/dist/tzDate.mjs +12 -0
  161. package/dist/tzDate.mjs.map +1 -0
  162. package/dist/weekEnd.d.ts +12 -0
  163. package/dist/weekEnd.mjs +12 -0
  164. package/dist/weekEnd.mjs.map +1 -0
  165. package/dist/weekStart.d.ts +12 -0
  166. package/dist/weekStart.mjs +15 -0
  167. package/dist/weekStart.mjs.map +1 -0
  168. package/dist/yearDays.d.ts +9 -0
  169. package/dist/yearDays.mjs +10 -0
  170. package/dist/yearDays.mjs.map +1 -0
  171. package/dist/yearEnd.d.ts +9 -0
  172. package/dist/yearEnd.mjs +13 -0
  173. package/dist/yearEnd.mjs.map +1 -0
  174. package/dist/yearStart.d.ts +9 -0
  175. package/dist/yearStart.mjs +13 -0
  176. package/dist/yearStart.mjs.map +1 -0
  177. package/package.json +8 -1
@@ -0,0 +1,13 @@
1
+ // src/formatStr.ts
2
+ import { parts } from "./parts.mjs";
3
+ import { escapeTokens } from "./common.mjs";
4
+ function formatStr(format, locale = "en", escapeLiterals = false, filterParts = () => true) {
5
+ return parts(format, locale).filter(filterParts).reduce(
6
+ (f, p) => f += escapeLiterals && p.partName === "literal" ? escapeTokens(p.token) : p.token,
7
+ ""
8
+ ).normalize("NFKC");
9
+ }
10
+ export {
11
+ formatStr
12
+ };
13
+ //# sourceMappingURL=formatStr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/formatStr.ts"],"sourcesContent":["import { parts } from \"./parts\"\nimport { escapeTokens } from \"./common\"\nimport type { Format, Part } from \"./types\"\n\n/**\n * Return the string format for a given format. For example:\n * ```js\n * formatStr({ date: 'long' }, 'en') // dddd, MMMM D, YYYY\n * ```\n * @param format - A format string or object.\n * @param locale - A locale or en by default.\n */\nexport function formatStr(\n format: Format,\n locale = \"en\",\n escapeLiterals = false,\n filterParts: (part: Part) => boolean = () => true\n): string {\n return parts(format, locale)\n .filter(filterParts)\n .reduce(\n (f, p) =>\n (f +=\n escapeLiterals && p.partName === \"literal\"\n ? escapeTokens(p.token)\n : p.token),\n \"\"\n )\n .normalize(\"NFKC\")\n}\n"],"mappings":";AAAA,SAAS,aAAa;AACtB,SAAS,oBAAoB;AAWtB,SAAS,UACd,QACA,SAAS,MACT,iBAAiB,OACjB,cAAuC,MAAM,MACrC;AACR,SAAO,MAAM,QAAQ,MAAM,EACxB,OAAO,WAAW,EAClB;AAAA,IACC,CAAC,GAAG,MACD,KACC,kBAAkB,EAAE,aAAa,YAC7B,aAAa,EAAE,KAAK,IACpB,EAAE;AAAA,IACV;AAAA,EACF,EACC,UAAU,MAAM;AACrB;","names":[]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Converts a 2 digit year into a 4 digit year. This function assumes years 20
3
+ * years into the future belong to the current century, and the past 80 are in
4
+ * the past.
5
+ *
6
+ * @param value - 2 digits in string format
7
+ */
8
+ declare function fourDigitYear(value: string): number;
9
+
10
+ export { fourDigitYear };
@@ -0,0 +1,12 @@
1
+ // src/fourDigitYear.ts
2
+ function fourDigitYear(value) {
3
+ const y = (/* @__PURE__ */ new Date()).getFullYear();
4
+ const currentYear = y % 100;
5
+ const century = Math.floor(y / 100);
6
+ const parsedYear = Number(value);
7
+ return (century + (parsedYear > currentYear + 20 ? -1 : 0)) * 100 + parsedYear;
8
+ }
9
+ export {
10
+ fourDigitYear
11
+ };
12
+ //# sourceMappingURL=fourDigitYear.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/fourDigitYear.ts"],"sourcesContent":["/**\n * Converts a 2 digit year into a 4 digit year. This function assumes years 20\n * years into the future belong to the current century, and the past 80 are in\n * the past.\n *\n * @param value - 2 digits in string format\n */\nexport function fourDigitYear(value: string): number {\n const y = new Date().getFullYear()\n const currentYear = y % 100\n const century = Math.floor(y / 100)\n const parsedYear = Number(value)\n return (century + (parsedYear > currentYear + 20 ? -1 : 0)) * 100 + parsedYear\n}\n"],"mappings":";AAOO,SAAS,cAAc,OAAuB;AACnD,QAAM,KAAI,oBAAI,KAAK,GAAE,YAAY;AACjC,QAAM,cAAc,IAAI;AACxB,QAAM,UAAU,KAAK,MAAM,IAAI,GAAG;AAClC,QAAM,aAAa,OAAO,KAAK;AAC/B,UAAQ,WAAW,aAAa,cAAc,KAAK,KAAK,MAAM,MAAM;AACtE;","names":[]}
@@ -0,0 +1,9 @@
1
+ import { DateInput } from './types.js';
2
+
3
+ /**
4
+ * Returns a Date object for end of the given hour.
5
+ * @param inputDate - A string or Date object
6
+ */
7
+ declare function hourEnd(inputDate: DateInput): Date;
8
+
9
+ export { hourEnd };
@@ -0,0 +1,11 @@
1
+ // src/hourEnd.ts
2
+ import { date } from "./date.mjs";
3
+ function hourEnd(inputDate) {
4
+ const d = date(inputDate);
5
+ d.setMinutes(59, 59, 999);
6
+ return d;
7
+ }
8
+ export {
9
+ hourEnd
10
+ };
11
+ //# sourceMappingURL=hourEnd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hourEnd.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput } from \"./types\"\n\n/**\n * Returns a Date object for end of the given hour.\n * @param inputDate - A string or Date object\n */\nexport function hourEnd(inputDate: DateInput): Date {\n const d = date(inputDate)\n d.setMinutes(59, 59, 999)\n return d\n}\n"],"mappings":";AAAA,SAAS,YAAY;AAOd,SAAS,QAAQ,WAA4B;AAClD,QAAM,IAAI,KAAK,SAAS;AACxB,IAAE,WAAW,IAAI,IAAI,GAAG;AACxB,SAAO;AACT;","names":[]}
@@ -0,0 +1,9 @@
1
+ import { DateInput } from './types.js';
2
+
3
+ /**
4
+ * Returns a Date object for start of the given hour.
5
+ * @param inputDate - A string or Date object
6
+ */
7
+ declare function hourStart(inputDate: DateInput): Date;
8
+
9
+ export { hourStart };
@@ -0,0 +1,11 @@
1
+ // src/hourStart.ts
2
+ import { date } from "./date.mjs";
3
+ function hourStart(inputDate) {
4
+ const d = date(inputDate);
5
+ d.setMinutes(0, 0);
6
+ return d;
7
+ }
8
+ export {
9
+ hourStart
10
+ };
11
+ //# sourceMappingURL=hourStart.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hourStart.ts"],"sourcesContent":["import { date } from \"./date\"\nimport type { DateInput } from \"./types\"\n\n/**\n * Returns a Date object for start of the given hour.\n * @param inputDate - A string or Date object\n */\nexport function hourStart(inputDate: DateInput): Date {\n const d = date(inputDate)\n d.setMinutes(0, 0)\n return d\n}\n"],"mappings":";AAAA,SAAS,YAAY;AAOd,SAAS,UAAU,WAA4B;AACpD,QAAM,IAAI,KAAK,SAAS;AACxB,IAAE,WAAW,GAAG,CAAC;AACjB,SAAO;AACT;","names":[]}
package/dist/index.cjs CHANGED
@@ -32,6 +32,14 @@ __export(src_exports, {
32
32
  dayEnd: () => dayEnd,
33
33
  dayOfYear: () => dayOfYear,
34
34
  dayStart: () => dayStart,
35
+ diffDays: () => diffDays,
36
+ diffHours: () => diffHours,
37
+ diffMilliseconds: () => diffMilliseconds,
38
+ diffMinutes: () => diffMinutes,
39
+ diffMonths: () => diffMonths,
40
+ diffSeconds: () => diffSeconds,
41
+ diffWeeks: () => diffWeeks,
42
+ diffYears: () => diffYears,
35
43
  format: () => format,
36
44
  formatStr: () => formatStr,
37
45
  fourDigitYear: () => fourDigitYear,
@@ -204,6 +212,7 @@ var clockAgnostic = [
204
212
  ["m", { minute: "numeric" }],
205
213
  ["ss", { second: "2-digit" }],
206
214
  ["s", { second: "numeric" }],
215
+ ["ZZ", { timeZoneName: "long" }],
207
216
  ["Z", { timeZoneName: "short" }]
208
217
  ];
209
218
  var clock24 = [
@@ -274,7 +283,7 @@ function fill(inputDate, parts2, locale, genitive = false, offset2 = null) {
274
283
  return token === "A" ? p.toUpperCase() : p.toLowerCase();
275
284
  }
276
285
  if (partName === "timeZoneName") {
277
- return offset2 != null ? offset2 : minsToOffset(-1 * d.getTimezoneOffset());
286
+ return offset2 != null ? offset2 : minsToOffset(-1 * d.getTimezoneOffset(), token);
278
287
  }
279
288
  return value2;
280
289
  }
@@ -345,23 +354,35 @@ function createPartMap(inputDate, parts2, locale, genitive = false) {
345
354
  return map;
346
355
  }, {});
347
356
  }
348
- function minsToOffset(timeDiffInMins) {
357
+ function minsToOffset(timeDiffInMins, token = "Z") {
349
358
  const hours = String(Math.floor(Math.abs(timeDiffInMins / 60))).padStart(
350
359
  2,
351
360
  "0"
352
361
  );
353
362
  const mins = String(Math.abs(timeDiffInMins % 60)).padStart(2, "0");
354
363
  const sign = timeDiffInMins < 0 ? "-" : "+";
355
- return `${sign}${hours}${mins}`;
364
+ if (token === "ZZ") {
365
+ return `${sign}${hours}${mins}`;
366
+ }
367
+ return `${sign}${hours}:${mins}`;
356
368
  }
357
- function offsetToMins(offset2) {
358
- validOffset(offset2);
359
- const [_, sign, hours, mins] = offset2.match(/([+-])([0-3][0-9])([0-6][0-9])/);
369
+ function offsetToMins(offset2, token) {
370
+ validOffset(offset2, token);
371
+ const [_, sign, hours, mins] = offset2.match(
372
+ /([+-])([0-3][0-9]):?([0-6][0-9])/
373
+ );
360
374
  const offsetInMins = Number(hours) * 60 + Number(mins);
361
375
  return sign === "+" ? offsetInMins : -offsetInMins;
362
376
  }
363
- function validOffset(offset2) {
364
- const valid = /^([+-])[0-3][0-9]:?[0-6][0-9]$/.test(offset2);
377
+ function validOffset(offset2, token = "Z") {
378
+ const valid = ((token2) => {
379
+ switch (token2) {
380
+ case "Z":
381
+ return /^([+-])[0-3][0-9]:[0-6][0-9]$/.test(offset2);
382
+ case "ZZ":
383
+ return /^([+-])[0-3][0-9][0-6][0-9]$/.test(offset2);
384
+ }
385
+ })(token);
365
386
  if (!valid)
366
387
  throw new Error(`Invalid offset: ${offset2}`);
367
388
  return offset2;
@@ -391,6 +412,12 @@ function validate(parts2) {
391
412
  }
392
413
  return parts2;
393
414
  }
415
+ function getOffsetFormat(format2) {
416
+ if (typeof format2 === "string") {
417
+ return format2.includes("ZZ") ? "ZZ" : "Z";
418
+ }
419
+ return "time" in format2 && format2.time === "full" ? "Z" : "ZZ";
420
+ }
394
421
 
395
422
  // src/ap.ts
396
423
  function ap(ampm, locale) {
@@ -417,9 +444,17 @@ function ap(ampm, locale) {
417
444
  }
418
445
 
419
446
  // src/applyOffset.ts
420
- function applyOffset(dateInput, offset2 = "+0000") {
447
+ function applyOffset(dateInput, offset2 = "+00:00") {
421
448
  const d = date(dateInput);
422
- const timeDiffInMins = offsetToMins(offset2);
449
+ const token = (() => {
450
+ switch (fixedLengthByOffset(offset2)) {
451
+ case 5:
452
+ return "ZZ";
453
+ case 6:
454
+ return "Z";
455
+ }
456
+ })();
457
+ const timeDiffInMins = offsetToMins(offset2, token);
423
458
  return new Date(d.getTime() + timeDiffInMins * 1e3 * 60);
424
459
  }
425
460
 
@@ -448,14 +483,14 @@ function relativeTime(d, timeZone) {
448
483
  `${parts2.year}-${parts2.month}-${parts2.day}T${parts2.hour}:${parts2.minute}:${parts2.second}Z`
449
484
  );
450
485
  }
451
- function offset(utcTime, tzA = "UTC", tzB = "device") {
486
+ function offset(utcTime, tzA = "UTC", tzB = "device", timeZoneToken = "Z") {
452
487
  var _a;
453
488
  tzB = tzB === "device" ? (_a = deviceTZ()) != null ? _a : "utc" : tzB;
454
489
  const d = date(utcTime);
455
490
  const timeA = relativeTime(d, tzA);
456
491
  const timeB = relativeTime(d, tzB);
457
492
  const timeDiffInMins = (timeB.getTime() - timeA.getTime()) / 1e3 / 60;
458
- return minsToOffset(timeDiffInMins);
493
+ return minsToOffset(timeDiffInMins, timeZoneToken);
459
494
  }
460
495
 
461
496
  // src/tzDate.ts
@@ -572,7 +607,8 @@ function styleParts(format2, locale) {
572
607
  part.type,
573
608
  part.value,
574
609
  locale,
575
- part.type === "hour" ? hourType : void 0
610
+ part.type === "hour" ? hourType : void 0,
611
+ options
576
612
  );
577
613
  if (formatPattern === void 0)
578
614
  return;
@@ -591,7 +627,7 @@ function styleParts(format2, locale) {
591
627
  };
592
628
  }).filter((part) => !!part);
593
629
  }
594
- function guessPattern(partName, partValue, locale, hour) {
630
+ function guessPattern(partName, partValue, locale, hour, options) {
595
631
  const l = partValue.length;
596
632
  const n = !isNaN(Number(partValue));
597
633
  let style;
@@ -633,8 +669,7 @@ function guessPattern(partName, partValue, locale, hour) {
633
669
  case "literal":
634
670
  return [partValue, { literal: partValue }, new RegExp("")];
635
671
  case "timeZoneName":
636
- const offset2 = partValue.split("-");
637
- return offset2.length === 2 && offset2[1].length === 4 ? tokens.get("ZZ") : tokens.get("Z");
672
+ return options.timeStyle === "full" ? tokens.get("Z") : tokens.get("ZZ");
638
673
  default:
639
674
  return void 0;
640
675
  }
@@ -688,7 +723,7 @@ function partStyle(locale, part, value) {
688
723
  }
689
724
 
690
725
  // src/removeOffset.ts
691
- function removeOffset(dateInput, offset2 = "+0000") {
726
+ function removeOffset(dateInput, offset2 = "+00:00") {
692
727
  const positive = offset2.slice(0, 1) === "+";
693
728
  return applyOffset(
694
729
  dateInput,
@@ -718,7 +753,7 @@ function format(inputDateOrOptions, format2 = "long", locale = "device", genitiv
718
753
  if (format2 === "ISO8601")
719
754
  return date(inputDateOrOptions).toISOString();
720
755
  if (tz) {
721
- forceOffset = offset(inputDateOrOptions, "utc", tz);
756
+ forceOffset = offset(inputDateOrOptions, "utc", tz, getOffsetFormat(format2));
722
757
  }
723
758
  tz != null ? tz : tz = deviceTZ();
724
759
  if ((tz == null ? void 0 : tz.toLowerCase()) !== "utc") {
@@ -950,8 +985,8 @@ function parse(dateStrOrOptions, format2 = "ISO8601", locale = "device") {
950
985
  parsed.set("MM", v);
951
986
  } else if (t === "a" || t === "A") {
952
987
  a = part.value.toLowerCase() === ap("am", locale).toLowerCase();
953
- } else if (t === "Z") {
954
- offset2 = validOffset(part.value);
988
+ } else if (t === "Z" || t === "ZZ") {
989
+ offset2 = validOffset(part.value, t);
955
990
  } else {
956
991
  const values = range(t, locale, genitive);
957
992
  const index = values.indexOf(part.value);
@@ -1124,6 +1159,82 @@ function isEqual(dateLeft, dateRight) {
1124
1159
  const _dateRight = date(dateRight);
1125
1160
  return +_dateLeft === +_dateRight;
1126
1161
  }
1162
+
1163
+ // src/diffMilliseconds.ts
1164
+ function diffMilliseconds(dateA, dateB) {
1165
+ const left = date(dateA);
1166
+ const right = date(dateB);
1167
+ return +left - +right;
1168
+ }
1169
+
1170
+ // src/diffRound.ts
1171
+ function diffRound(value, method = "trunc") {
1172
+ const r = Math[method](value);
1173
+ return r == 0 ? 0 : r;
1174
+ }
1175
+
1176
+ // src/diffSeconds.ts
1177
+ function diffSeconds(dateA, dateB, roundingMethod) {
1178
+ return diffRound(diffMilliseconds(dateA, dateB) / 1e3, roundingMethod);
1179
+ }
1180
+
1181
+ // src/diffMinutes.ts
1182
+ function diffMinutes(dateA, dateB, roundingMethod) {
1183
+ return diffRound(diffMilliseconds(dateA, dateB) / 6e4, roundingMethod);
1184
+ }
1185
+
1186
+ // src/diffHours.ts
1187
+ function diffHours(dateA, dateB, roundingMethod) {
1188
+ return diffRound(
1189
+ diffMilliseconds(dateA, dateB) / 36e5,
1190
+ // 1000 * 60 * 60
1191
+ roundingMethod
1192
+ );
1193
+ }
1194
+
1195
+ // src/diffDays.ts
1196
+ function diffDays(dateA, dateB, roundingMethod) {
1197
+ return diffRound(
1198
+ diffMilliseconds(dateA, dateB) / 864e5,
1199
+ // hour * 24
1200
+ roundingMethod
1201
+ );
1202
+ }
1203
+
1204
+ // src/diffWeeks.ts
1205
+ function diffWeeks(dateA, dateB, roundingMethod) {
1206
+ return diffRound(
1207
+ diffMilliseconds(dateA, dateB) / 6048e5,
1208
+ // day * 7
1209
+ roundingMethod
1210
+ );
1211
+ }
1212
+
1213
+ // src/diffMonths.ts
1214
+ function diffMonths(dateA, dateB) {
1215
+ const l = date(dateA);
1216
+ const r = date(dateB);
1217
+ if (l < r) {
1218
+ const rs = diffMonths(r, l);
1219
+ return rs == 0 ? 0 : -rs;
1220
+ }
1221
+ let months = (l.getFullYear() - r.getFullYear()) * 12 + (l.getMonth() - r.getMonth());
1222
+ const ld = l.getDate();
1223
+ const rd = r.getDate();
1224
+ if (ld < rd) {
1225
+ const lm = monthDays(l);
1226
+ if (!(lm == ld && lm < rd)) {
1227
+ months--;
1228
+ }
1229
+ }
1230
+ return months == 0 ? 0 : months;
1231
+ }
1232
+
1233
+ // src/diffYears.ts
1234
+ function diffYears(dateA, dateB) {
1235
+ const r = Math.trunc(diffMonths(dateA, dateB) / 12);
1236
+ return r == 0 ? 0 : r;
1237
+ }
1127
1238
  // Annotate the CommonJS export names for ESM import in node:
1128
1239
  0 && (module.exports = {
1129
1240
  addDay,
@@ -1138,6 +1249,14 @@ function isEqual(dateLeft, dateRight) {
1138
1249
  dayEnd,
1139
1250
  dayOfYear,
1140
1251
  dayStart,
1252
+ diffDays,
1253
+ diffHours,
1254
+ diffMilliseconds,
1255
+ diffMinutes,
1256
+ diffMonths,
1257
+ diffSeconds,
1258
+ diffWeeks,
1259
+ diffYears,
1141
1260
  format,
1142
1261
  formatStr,
1143
1262
  fourDigitYear,