chrono-node 2.7.8 → 2.8.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 (182) hide show
  1. package/dist/cjs/common/casualReferences.js +8 -10
  2. package/dist/cjs/common/casualReferences.js.map +1 -1
  3. package/dist/cjs/common/refiners/ForwardDateRefiner.js +33 -12
  4. package/dist/cjs/common/refiners/ForwardDateRefiner.js.map +1 -1
  5. package/dist/cjs/locales/en/parsers/ENCasualDateParser.js +4 -1
  6. package/dist/cjs/locales/en/parsers/ENCasualDateParser.js.map +1 -1
  7. package/dist/cjs/locales/it/constants.d.ts +28 -0
  8. package/dist/cjs/locales/it/constants.js +165 -0
  9. package/dist/cjs/locales/it/constants.js.map +1 -0
  10. package/dist/cjs/locales/it/index.d.ts +9 -0
  11. package/dist/cjs/locales/it/index.js +66 -0
  12. package/dist/cjs/locales/it/index.js.map +1 -0
  13. package/dist/cjs/locales/it/parsers/ITCasualDateParser.d.ts +7 -0
  14. package/dist/cjs/locales/it/parsers/ITCasualDateParser.js +65 -0
  15. package/dist/cjs/locales/it/parsers/ITCasualDateParser.js.map +1 -0
  16. package/dist/cjs/locales/it/parsers/ITCasualTimeParser.d.ts +6 -0
  17. package/dist/cjs/locales/it/parsers/ITCasualTimeParser.js +47 -0
  18. package/dist/cjs/locales/it/parsers/ITCasualTimeParser.js.map +1 -0
  19. package/dist/cjs/locales/it/parsers/ITCasualYearMonthDayParser.d.ts +10 -0
  20. package/dist/cjs/locales/it/parsers/ITCasualYearMonthDayParser.js +35 -0
  21. package/dist/cjs/locales/it/parsers/ITCasualYearMonthDayParser.js.map +1 -0
  22. package/dist/cjs/locales/it/parsers/ITMonthNameLittleEndianParser.d.ts +7 -0
  23. package/dist/cjs/locales/it/parsers/ITMonthNameLittleEndianParser.js +57 -0
  24. package/dist/cjs/locales/it/parsers/ITMonthNameLittleEndianParser.js.map +1 -0
  25. package/dist/cjs/locales/it/parsers/ITMonthNameMiddleEndianParser.d.ts +6 -0
  26. package/dist/cjs/locales/it/parsers/ITMonthNameMiddleEndianParser.js +59 -0
  27. package/dist/cjs/locales/it/parsers/ITMonthNameMiddleEndianParser.js.map +1 -0
  28. package/dist/cjs/locales/it/parsers/ITMonthNameParser.d.ts +6 -0
  29. package/dist/cjs/locales/it/parsers/ITMonthNameParser.js +43 -0
  30. package/dist/cjs/locales/it/parsers/ITMonthNameParser.js.map +1 -0
  31. package/dist/cjs/locales/it/parsers/ITRelativeDateFormatParser.d.ts +7 -0
  32. package/dist/cjs/locales/it/parsers/ITRelativeDateFormatParser.js +57 -0
  33. package/dist/cjs/locales/it/parsers/ITRelativeDateFormatParser.js.map +1 -0
  34. package/dist/cjs/locales/it/parsers/ITSlashMonthFormatParser.d.ts +7 -0
  35. package/dist/cjs/locales/it/parsers/ITSlashMonthFormatParser.js +18 -0
  36. package/dist/cjs/locales/it/parsers/ITSlashMonthFormatParser.js.map +1 -0
  37. package/dist/cjs/locales/it/parsers/ITTimeExpressionParser.d.ts +10 -0
  38. package/dist/cjs/locales/it/parsers/ITTimeExpressionParser.js +50 -0
  39. package/dist/cjs/locales/it/parsers/ITTimeExpressionParser.js.map +1 -0
  40. package/dist/cjs/locales/it/parsers/ITTimeUnitAgoFormatParser.d.ts +9 -0
  41. package/dist/cjs/locales/it/parsers/ITTimeUnitAgoFormatParser.js +24 -0
  42. package/dist/cjs/locales/it/parsers/ITTimeUnitAgoFormatParser.js.map +1 -0
  43. package/dist/cjs/locales/it/parsers/ITTimeUnitCasualRelativeFormatParser.d.ts +7 -0
  44. package/dist/cjs/locales/it/parsers/ITTimeUnitCasualRelativeFormatParser.js +26 -0
  45. package/dist/cjs/locales/it/parsers/ITTimeUnitCasualRelativeFormatParser.js.map +1 -0
  46. package/dist/cjs/locales/it/parsers/ITTimeUnitLaterFormatParser.d.ts +9 -0
  47. package/dist/cjs/locales/it/parsers/ITTimeUnitLaterFormatParser.js +23 -0
  48. package/dist/cjs/locales/it/parsers/ITTimeUnitLaterFormatParser.js.map +1 -0
  49. package/dist/cjs/locales/it/parsers/ITTimeUnitWithinFormatParser.d.ts +7 -0
  50. package/dist/cjs/locales/it/parsers/ITTimeUnitWithinFormatParser.js +19 -0
  51. package/dist/cjs/locales/it/parsers/ITTimeUnitWithinFormatParser.js.map +1 -0
  52. package/dist/cjs/locales/it/parsers/ITWeekdayParser.d.ts +7 -0
  53. package/dist/cjs/locales/it/parsers/ITWeekdayParser.js +43 -0
  54. package/dist/cjs/locales/it/parsers/ITWeekdayParser.js.map +1 -0
  55. package/dist/cjs/locales/it/refiners/ITMergeDateRangeRefiner.d.ts +4 -0
  56. package/dist/cjs/locales/it/refiners/ITMergeDateRangeRefiner.js +13 -0
  57. package/dist/cjs/locales/it/refiners/ITMergeDateRangeRefiner.js.map +1 -0
  58. package/dist/cjs/locales/it/refiners/ITMergeDateTimeRefiner.d.ts +4 -0
  59. package/dist/cjs/locales/it/refiners/ITMergeDateTimeRefiner.js +13 -0
  60. package/dist/cjs/locales/it/refiners/ITMergeDateTimeRefiner.js.map +1 -0
  61. package/dist/cjs/locales/it/refiners/ITMergeRelativeDateRefiner.d.ts +7 -0
  62. package/dist/cjs/locales/it/refiners/ITMergeRelativeDateRefiner.js +36 -0
  63. package/dist/cjs/locales/it/refiners/ITMergeRelativeDateRefiner.js.map +1 -0
  64. package/dist/cjs/locales/ja/parsers/JPCasualDateParser.js +4 -4
  65. package/dist/cjs/locales/ja/refiners/JPMergeDateRangeRefiner.js +1 -1
  66. package/dist/cjs/locales/ja/refiners/JPMergeDateRangeRefiner.js.map +1 -1
  67. package/dist/cjs/results.d.ts +1 -0
  68. package/dist/cjs/results.js +18 -13
  69. package/dist/cjs/results.js.map +1 -1
  70. package/dist/cjs/utils/dates.d.ts +3 -0
  71. package/dist/cjs/utils/dates.js +17 -0
  72. package/dist/cjs/utils/dates.js.map +1 -0
  73. package/dist/cjs/utils/dayjs.js.map +1 -1
  74. package/dist/esm/common/casualReferences.js +8 -10
  75. package/dist/esm/common/casualReferences.js.map +1 -1
  76. package/dist/esm/common/refiners/ForwardDateRefiner.js +14 -12
  77. package/dist/esm/common/refiners/ForwardDateRefiner.js.map +1 -1
  78. package/dist/esm/locales/en/parsers/ENCasualDateParser.js +4 -1
  79. package/dist/esm/locales/en/parsers/ENCasualDateParser.js.map +1 -1
  80. package/dist/esm/locales/it/constants.d.ts +28 -0
  81. package/dist/esm/locales/it/constants.js +200 -0
  82. package/dist/esm/locales/it/constants.js.map +1 -0
  83. package/dist/esm/locales/it/index.d.ts +9 -0
  84. package/dist/esm/locales/it/index.js +56 -0
  85. package/dist/esm/locales/it/index.js.map +1 -0
  86. package/dist/esm/locales/it/parsers/ITCasualDateParser.d.ts +7 -0
  87. package/dist/esm/locales/it/parsers/ITCasualDateParser.js +40 -0
  88. package/dist/esm/locales/it/parsers/ITCasualDateParser.js.map +1 -0
  89. package/dist/esm/locales/it/parsers/ITCasualTimeParser.d.ts +6 -0
  90. package/dist/esm/locales/it/parsers/ITCasualTimeParser.js +41 -0
  91. package/dist/esm/locales/it/parsers/ITCasualTimeParser.js.map +1 -0
  92. package/dist/esm/locales/it/parsers/ITCasualYearMonthDayParser.d.ts +10 -0
  93. package/dist/esm/locales/it/parsers/ITCasualYearMonthDayParser.js +32 -0
  94. package/dist/esm/locales/it/parsers/ITCasualYearMonthDayParser.js.map +1 -0
  95. package/dist/esm/locales/it/parsers/ITMonthNameLittleEndianParser.d.ts +7 -0
  96. package/dist/esm/locales/it/parsers/ITMonthNameLittleEndianParser.js +54 -0
  97. package/dist/esm/locales/it/parsers/ITMonthNameLittleEndianParser.js.map +1 -0
  98. package/dist/esm/locales/it/parsers/ITMonthNameMiddleEndianParser.d.ts +6 -0
  99. package/dist/esm/locales/it/parsers/ITMonthNameMiddleEndianParser.js +56 -0
  100. package/dist/esm/locales/it/parsers/ITMonthNameMiddleEndianParser.js.map +1 -0
  101. package/dist/esm/locales/it/parsers/ITMonthNameParser.d.ts +6 -0
  102. package/dist/esm/locales/it/parsers/ITMonthNameParser.js +40 -0
  103. package/dist/esm/locales/it/parsers/ITMonthNameParser.js.map +1 -0
  104. package/dist/esm/locales/it/parsers/ITRelativeDateFormatParser.d.ts +7 -0
  105. package/dist/esm/locales/it/parsers/ITRelativeDateFormatParser.js +51 -0
  106. package/dist/esm/locales/it/parsers/ITRelativeDateFormatParser.js.map +1 -0
  107. package/dist/esm/locales/it/parsers/ITSlashMonthFormatParser.d.ts +7 -0
  108. package/dist/esm/locales/it/parsers/ITSlashMonthFormatParser.js +15 -0
  109. package/dist/esm/locales/it/parsers/ITSlashMonthFormatParser.js.map +1 -0
  110. package/dist/esm/locales/it/parsers/ITTimeExpressionParser.d.ts +10 -0
  111. package/dist/esm/locales/it/parsers/ITTimeExpressionParser.js +47 -0
  112. package/dist/esm/locales/it/parsers/ITTimeExpressionParser.js.map +1 -0
  113. package/dist/esm/locales/it/parsers/ITTimeUnitAgoFormatParser.d.ts +9 -0
  114. package/dist/esm/locales/it/parsers/ITTimeUnitAgoFormatParser.js +21 -0
  115. package/dist/esm/locales/it/parsers/ITTimeUnitAgoFormatParser.js.map +1 -0
  116. package/dist/esm/locales/it/parsers/ITTimeUnitCasualRelativeFormatParser.d.ts +7 -0
  117. package/dist/esm/locales/it/parsers/ITTimeUnitCasualRelativeFormatParser.js +23 -0
  118. package/dist/esm/locales/it/parsers/ITTimeUnitCasualRelativeFormatParser.js.map +1 -0
  119. package/dist/esm/locales/it/parsers/ITTimeUnitLaterFormatParser.d.ts +9 -0
  120. package/dist/esm/locales/it/parsers/ITTimeUnitLaterFormatParser.js +20 -0
  121. package/dist/esm/locales/it/parsers/ITTimeUnitLaterFormatParser.js.map +1 -0
  122. package/dist/esm/locales/it/parsers/ITTimeUnitWithinFormatParser.d.ts +7 -0
  123. package/dist/esm/locales/it/parsers/ITTimeUnitWithinFormatParser.js +16 -0
  124. package/dist/esm/locales/it/parsers/ITTimeUnitWithinFormatParser.js.map +1 -0
  125. package/dist/esm/locales/it/parsers/ITWeekdayParser.d.ts +7 -0
  126. package/dist/esm/locales/it/parsers/ITWeekdayParser.js +40 -0
  127. package/dist/esm/locales/it/parsers/ITWeekdayParser.js.map +1 -0
  128. package/dist/esm/locales/it/refiners/ITMergeDateRangeRefiner.d.ts +4 -0
  129. package/dist/esm/locales/it/refiners/ITMergeDateRangeRefiner.js +7 -0
  130. package/dist/esm/locales/it/refiners/ITMergeDateRangeRefiner.js.map +1 -0
  131. package/dist/esm/locales/it/refiners/ITMergeDateTimeRefiner.d.ts +4 -0
  132. package/dist/esm/locales/it/refiners/ITMergeDateTimeRefiner.js +7 -0
  133. package/dist/esm/locales/it/refiners/ITMergeDateTimeRefiner.js.map +1 -0
  134. package/dist/esm/locales/it/refiners/ITMergeRelativeDateRefiner.d.ts +7 -0
  135. package/dist/esm/locales/it/refiners/ITMergeRelativeDateRefiner.js +33 -0
  136. package/dist/esm/locales/it/refiners/ITMergeRelativeDateRefiner.js.map +1 -0
  137. package/dist/esm/locales/ja/parsers/JPCasualDateParser.js +4 -4
  138. package/dist/esm/locales/ja/refiners/JPMergeDateRangeRefiner.js +1 -1
  139. package/dist/esm/locales/ja/refiners/JPMergeDateRangeRefiner.js.map +1 -1
  140. package/dist/esm/results.d.ts +1 -0
  141. package/dist/esm/results.js +17 -13
  142. package/dist/esm/results.js.map +1 -1
  143. package/dist/esm/utils/dates.d.ts +3 -0
  144. package/dist/esm/utils/dates.js +12 -0
  145. package/dist/esm/utils/dates.js.map +1 -0
  146. package/dist/esm/utils/dayjs.js.map +1 -1
  147. package/package.json +1 -1
  148. package/src/common/casualReferences.ts +8 -10
  149. package/src/common/refiners/ForwardDateRefiner.ts +17 -11
  150. package/src/locales/en/parsers/ENCasualDateParser.ts +5 -1
  151. package/src/locales/it/constants.ts +230 -0
  152. package/src/locales/it/index.ts +99 -0
  153. package/src/locales/it/parsers/ITCasualDateParser.ts +53 -0
  154. package/src/locales/it/parsers/ITCasualTimeParser.ts +50 -0
  155. package/src/locales/it/parsers/ITCasualYearMonthDayParser.ts +49 -0
  156. package/src/locales/it/parsers/ITMonthNameLittleEndianParser.ts +69 -0
  157. package/src/locales/it/parsers/ITMonthNameMiddleEndianParser.ts +78 -0
  158. package/src/locales/it/parsers/ITMonthNameParser.ts +62 -0
  159. package/src/locales/it/parsers/ITRelativeDateFormatParser.ts +71 -0
  160. package/src/locales/it/parsers/ITSlashMonthFormatParser.ts +26 -0
  161. package/src/locales/it/parsers/ITTimeExpressionParser.ts +55 -0
  162. package/src/locales/it/parsers/ITTimeUnitAgoFormatParser.ts +25 -0
  163. package/src/locales/it/parsers/ITTimeUnitCasualRelativeFormatParser.ts +30 -0
  164. package/src/locales/it/parsers/ITTimeUnitLaterFormatParser.ts +27 -0
  165. package/src/locales/it/parsers/ITTimeUnitWithinFormatParser.ts +26 -0
  166. package/src/locales/it/parsers/ITWeekdayParser.ts +47 -0
  167. package/src/locales/it/refiners/ITMergeDateRangeRefiner.ts +17 -0
  168. package/src/locales/it/refiners/ITMergeDateTimeRefiner.ts +13 -0
  169. package/src/locales/it/refiners/ITMergeRelativeDateRefiner.ts +58 -0
  170. package/src/locales/ja/parsers/JPCasualDateParser.ts +4 -4
  171. package/src/locales/ja/refiners/JPMergeDateRangeRefiner.ts +1 -1
  172. package/src/results.ts +18 -13
  173. package/src/utils/dates.ts +24 -0
  174. package/src/utils/dayjs.ts +6 -0
  175. package/test/en/en_casual.test.ts +4 -1
  176. package/test/en/en_relative.test.ts +126 -39
  177. package/test/en/en_time_exp.test.ts +27 -18
  178. package/test/ja/ja_casual.test.ts +8 -0
  179. package/test/ja/ja_standard.test.ts +19 -0
  180. package/test/nl/nl_relative.test.ts +33 -17
  181. package/test/result.test.ts +24 -0
  182. package/test/system_timezone.test.ts +20 -4
@@ -3,14 +3,14 @@ import dayjs from "dayjs";
3
3
  import { Meridiem } from "../../../types";
4
4
  import * as references from "../../../common/casualReferences";
5
5
 
6
- const PATTERN = /今日|きょう|当日|とうじつ|昨日|きのう|明日|あした|今夜|こんや|今夕|こんゆう|今晩|こんばん|今朝|けさ/i;
6
+ const PATTERN = /今日|きょう|本日|ほんじつ|昨日|きのう|明日|あした|今夜|こんや|今夕|こんゆう|今晩|こんばん|今朝|けさ/i;
7
7
 
8
8
  function normalizeTextToKanji(text: string) {
9
9
  switch (text) {
10
10
  case "きょう":
11
11
  return "今日";
12
- case "とうじつ":
13
- return "当日";
12
+ case "ほんじつ":
13
+ return "本日";
14
14
  case "きのう":
15
15
  return "昨日";
16
16
  case "あした":
@@ -46,8 +46,8 @@ export default class JPCasualDateParser implements Parser {
46
46
  case "明日":
47
47
  return references.tomorrow(context.reference);
48
48
 
49
+ case "本日":
49
50
  case "今日":
50
- case "当日":
51
51
  return references.today(context.reference);
52
52
  }
53
53
 
@@ -8,6 +8,6 @@ import AbstractMergeDateRangeRefiner from "../../../common/refiners/AbstractMerg
8
8
  */
9
9
  export default class JPMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner {
10
10
  patternBetween(): RegExp {
11
- return /^\s*(から|ー|-)\s*$/i;
11
+ return /^\s*(から|ー|-|~|~)\s*$/i;
12
12
  }
13
13
  }
package/src/results.ts CHANGED
@@ -14,6 +14,7 @@ export class ReferenceWithTimezone {
14
14
  input = input ?? new Date();
15
15
  if (input instanceof Date) {
16
16
  this.instant = input;
17
+ this.timezoneOffset = null;
17
18
  } else {
18
19
  this.instant = input.instant ?? new Date();
19
20
  this.timezoneOffset = toTimezoneOffset(input.timezone, this.instant);
@@ -25,7 +26,11 @@ export class ReferenceWithTimezone {
25
26
  * The output's instant is NOT the reference's instant when the reference's and system's timezone are different.
26
27
  */
27
28
  getDateWithAdjustedTimezone() {
28
- return new Date(this.instant.getTime() + this.getSystemTimezoneAdjustmentMinute(this.instant) * 60000);
29
+ const date = new Date(this.instant);
30
+ if (this.timezoneOffset !== null) {
31
+ date.setMinutes(date.getMinutes() - this.getSystemTimezoneAdjustmentMinute(this.instant));
32
+ }
33
+ return date;
29
34
  }
30
35
 
31
36
  /**
@@ -44,6 +49,10 @@ export class ReferenceWithTimezone {
44
49
  const targetTimezoneOffset = overrideTimezoneOffset ?? this.timezoneOffset ?? currentTimezoneOffset;
45
50
  return currentTimezoneOffset - targetTimezoneOffset;
46
51
  }
52
+
53
+ getTimezoneOffset(): number {
54
+ return this.timezoneOffset ?? -this.instant.getTimezoneOffset();
55
+ }
47
56
  }
48
57
 
49
58
  export class ParsingComponents implements ParsedComponents {
@@ -62,10 +71,10 @@ export class ParsingComponents implements ParsedComponents {
62
71
  }
63
72
  }
64
73
 
65
- const refDayJs = dayjs(reference.instant);
66
- this.imply("day", refDayJs.date());
67
- this.imply("month", refDayJs.month() + 1);
68
- this.imply("year", refDayJs.year());
74
+ const refDayJs = reference.getDateWithAdjustedTimezone();
75
+ this.imply("day", refDayJs.getDate());
76
+ this.imply("month", refDayJs.getMonth() + 1);
77
+ this.imply("year", refDayJs.getFullYear());
69
78
  this.imply("hour", 12);
70
79
  this.imply("minute", 0);
71
80
  this.imply("second", 0);
@@ -166,7 +175,7 @@ export class ParsingComponents implements ParsedComponents {
166
175
  }
167
176
 
168
177
  dayjs() {
169
- return dayjs(this.date());
178
+ return dayjs(this.dateWithoutTimezoneAdjustment());
170
179
  }
171
180
 
172
181
  date(): Date {
@@ -210,7 +219,7 @@ export class ParsingComponents implements ParsedComponents {
210
219
  reference: ReferenceWithTimezone,
211
220
  fragments: { [c in QUnitType]?: number }
212
221
  ): ParsingComponents {
213
- let date = dayjs(reference.instant);
222
+ let date = dayjs(reference.getDateWithAdjustedTimezone());
214
223
  for (const key in fragments) {
215
224
  date = date.add(fragments[key as QUnitType], key as QUnitType);
216
225
  }
@@ -221,14 +230,10 @@ export class ParsingComponents implements ParsedComponents {
221
230
  components.addTag("result/relativeDateAndTime");
222
231
  assignSimilarTime(components, date);
223
232
  assignSimilarDate(components, date);
224
- if (reference.timezoneOffset !== null) {
225
- components.assign("timezoneOffset", -reference.instant.getTimezoneOffset());
226
- }
233
+ components.assign("timezoneOffset", reference.getTimezoneOffset());
227
234
  } else {
228
235
  implySimilarTime(components, date);
229
- if (reference.timezoneOffset !== null) {
230
- components.imply("timezoneOffset", -reference.instant.getTimezoneOffset());
231
- }
236
+ components.imply("timezoneOffset", reference.getTimezoneOffset());
232
237
 
233
238
  if (fragments["d"]) {
234
239
  components.assign("day", date.date());
@@ -0,0 +1,24 @@
1
+ import { ParsingComponents } from "../results";
2
+
3
+ /**
4
+ * Imply (weakly update) the parsing component to the same day as the `target`.
5
+ * @param component the component to be updated.
6
+ * @param target the target date with timezone adjusted.
7
+ */
8
+ export function implySimilarDate(component: ParsingComponents, target: Date) {
9
+ component.imply("day", target.getDate());
10
+ component.imply("month", target.getMonth() + 1);
11
+ component.imply("year", target.getFullYear());
12
+ }
13
+
14
+ /**
15
+ * Imply (weakly update) the parsing component to the same time as the `target`.
16
+ * @param component the component to be updated.
17
+ * @param target the target date with timezone adjusted.
18
+ */
19
+ export function implySimilarTime(component: ParsingComponents, target: Date) {
20
+ component.imply("hour", target.getHours());
21
+ component.imply("minute", target.getMinutes());
22
+ component.imply("second", target.getSeconds());
23
+ component.imply("millisecond", target.getMilliseconds());
24
+ }
@@ -32,12 +32,18 @@ export function assignSimilarTime(component: ParsingComponents, targetDayJs: day
32
32
  }
33
33
  }
34
34
 
35
+ /**
36
+ * @deprecated Use `dates.implySimilarDate` with normal Javascript Date instead.
37
+ */
35
38
  export function implySimilarDate(component: ParsingComponents, targetDayJs: dayjs.Dayjs) {
36
39
  component.imply("day", targetDayJs.date());
37
40
  component.imply("month", targetDayJs.month() + 1);
38
41
  component.imply("year", targetDayJs.year());
39
42
  }
40
43
 
44
+ /**
45
+ * @deprecated Use `dates.implySimilarTime` with normal Javascript Date instead.
46
+ */
41
47
  export function implySimilarTime(component: ParsingComponents, targetDayJs: dayjs.Dayjs) {
42
48
  component.imply("hour", targetDayJs.hour());
43
49
  component.imply("minute", targetDayJs.minute());
@@ -28,7 +28,10 @@ test("Test - Single Expression", () => {
28
28
  (result) => {
29
29
  expect(result.text).toBe("now");
30
30
  expect(result.start).toBeDate(new Date(1637674343000));
31
- expect(result.start.isCertain("timezoneOffset")).toBe(false);
31
+
32
+ // Although the timezone is not specified, we need to assume it is similar to the system default.
33
+ // We also must allow the timezoneOffset to be overridden. Otherwise, the "now" meaning is incorrect.
34
+ // expect(result.start.isCertain("timezoneOffset")).toBe(false);
32
35
  }
33
36
  );
34
37
 
@@ -238,69 +238,156 @@ test("Test - Relative date components' certainty", () => {
238
238
  });
239
239
  });
240
240
 
241
- test("Test - Relative date components' certainty and imply timezone", () => {
242
- const refDate = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
243
-
241
+ test("Test - Relative date when the timezone is irrelevant", () => {
244
242
  {
243
+ // Sun Nov 29 2020 13:24:13 GMT+0900 (JST)
244
+ // Sun Nov 29 2020 05:24:13 GMT+0100 (BST)
245
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
246
+
247
+ // The "now" is always exactly the same as the reference instant (regardless of the timezone).
245
248
  const text = "now";
246
- const result = chrono.parse(text, refDate)[0] as ParsingResult;
249
+ const result = chrono.parse(text, refInstant)[0] as ParsingResult;
250
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (JST)"));
251
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 05:24:13 GMT+0100 (BST)"));
247
252
 
248
- expect(result.text).toBe(text);
249
253
  result.start.imply("timezoneOffset", 60);
250
-
251
- expect(result).toBeDate(new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)"));
252
- expect(result).toBeDate(new Date("Sun Nov 29 2020 5:24:13 GMT+0100"));
254
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (JST)"));
255
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 05:24:13 GMT+0100 (BST)"));
253
256
  }
254
-
255
257
  {
256
- const text = "tomorrow at 5pm";
257
- const result = chrono.parse(text, refDate)[0] as ParsingResult;
258
+ // Sun Nov 29 2020 13:24:13 GMT+0900 (JST)
259
+ // Sun Nov 29 2020 05:24:13 GMT+0100 (BST)
260
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
258
261
 
259
- expect(result.text).toBe(text);
260
- result.start.imply("timezoneOffset", 60);
262
+ // Always "10 minutes" from the reference instant (regardless of the target timezone).
263
+ const text = "in 10 minutes";
264
+ const result = chrono.parse(text, refInstant)[0] as ParsingResult;
265
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (JST)"));
266
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 05:34:13 GMT+0100 (BST)"));
261
267
 
262
- expect(result).toBeDate(new Date("Sun Dec 1 2020 1:00:00 GMT+0900 (Japan Standard Time)"));
263
- expect(result).toBeDate(new Date("Sun Nov 30 2020 17:00:00 GMT+0100"));
268
+ result.start.imply("timezoneOffset", 60);
269
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (JST)"));
270
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 05:34:13 GMT+0100 (BST)"));
264
271
  }
265
-
266
272
  {
273
+ // Sun Nov 29 2020 13:24:13 GMT+0900 (JST)
274
+ // Sun Nov 29 2020 05:24:13 GMT+0100 (BST)
275
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
276
+
277
+ // Always "10 minutes" from the reference instant (regardless of the reference timezone).
267
278
  const text = "in 10 minutes";
268
- const result = chrono.parse(text, refDate)[0] as ParsingResult;
279
+ {
280
+ const result = chrono.parse(text, { instant: refInstant, timezone: "BST" })[0] as ParsingResult;
281
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (JST)"));
282
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 05:34:13 GMT+0100 (BST)"));
283
+ }
284
+ {
285
+ const result = chrono.parse(text, { instant: refInstant, timezone: "JST" })[0] as ParsingResult;
286
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (JST)"));
287
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 05:34:13 GMT+0100 (BST)"));
288
+ }
289
+ }
290
+ {
291
+ // Sun Nov 29 2020 13:24:13 GMT+0900 (JST)
292
+ // Sun Nov 29 2020 05:24:13 GMT+0100 (BST)
293
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
269
294
 
270
- expect(result.text).toBe(text);
271
- result.start.imply("timezoneOffset", 60);
295
+ const text = "in 20 minutes";
296
+ const result = chrono.parse(text, { instant: refInstant, timezone: null })[0] as ParsingResult;
297
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:44:13 GMT+0900 (JST)"));
298
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 05:44:13 GMT+0100 (BST)"));
272
299
 
273
- expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
274
- expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
300
+ // Although the timezone is not specified, we need to assume it is similar to the system default.
301
+ // We also must allow the timezoneOffset to be overridden. Otherwise, the relative meaning is incorrect.
302
+ // expect(result.start.isCertain("timezoneOffset")).toBe(false);
275
303
  }
304
+ });
276
305
 
306
+ test("Test - Relative date when the timezone is relevant but unknown", () => {
307
+ // Sun Nov 29 2020 13:24:13 (unknown timezone = system timezone)
308
+ const refInstant = new Date(2020, 11 - 1, 29, 13, 24, 13, 0);
309
+
310
+ // In the same (system) timezone, the "tomorrow" is 'Nov 30 2020'
311
+ const text = "tomorrow at 5pm";
312
+ const result = chrono.parse(text, refInstant)[0] as ParsingResult;
313
+ expect(result).toBeDate(new Date(2020, 11 - 1, 30, 17, 0, 0, 0));
314
+ expect(result.start.get("month")).toBe(11);
315
+ expect(result.start.get("day")).toBe(30);
316
+ expect(result.start.get("hour")).toBe(17);
317
+ });
318
+
319
+ test("Test - Relative date when the timezone is relevant and known", () => {
320
+ // Sun Nov 29 2020 13:24:13 GMT+0900 (JST)
321
+ // Sun Nov 29 2020 05:24:13 GMT+0100 (BST)
322
+ // Sat Nov 28 2020 21:24:13 GMT-0700 (PDT)
323
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
277
324
  {
278
- const text = "in 10 minutes";
279
- const result = chrono.parse(text, { instant: refDate, timezone: "BST" })[0] as ParsingResult;
325
+ // In JST (Nov 29 2020 13:24:13 GMT+0900), the "tomorrow" is 'Nov 30 2020'
326
+ const text = "tomorrow at 5pm";
327
+ const result = chrono.parse(text, { instant: refInstant, timezone: "JST" })[0] as ParsingResult;
328
+ expect(result).toBeDate(new Date("Mon Nov 30 2020 17:00:00 GMT+0900 (JST)"));
329
+ expect(result.start.get("month")).toBe(11);
330
+ expect(result.start.get("day")).toBe(30);
331
+ expect(result.start.get("hour")).toBe(17);
280
332
 
281
- expect(result.text).toBe(text);
333
+ // However, when implying the output timezone to be GMT+0100,
282
334
  result.start.imply("timezoneOffset", 60);
283
-
284
- expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
285
- expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
335
+ expect(result).toBeDate(new Date("Mon Nov 30 2020 17:00:00 GMT+0100 (BST)"));
286
336
  }
287
-
288
337
  {
289
- const text = "in 10 minutes";
290
- const result = chrono.parse(text, { instant: refDate, timezone: "JST" })[0] as ParsingResult;
338
+ // In BST (Nov 29 2020 05:24:13 GMT+0100), the "tomorrow" is 'Nov 30 2020'
339
+ const text = "tomorrow at 5pm";
340
+ const result = chrono.parse(text, { instant: refInstant, timezone: "BST" })[0] as ParsingResult;
341
+ expect(result).toBeDate(new Date("Mon Nov 30 2020 17:00:00 GMT+0100 (BST)"));
342
+ expect(result.start.get("month")).toBe(11);
343
+ expect(result.start.get("day")).toBe(30);
344
+ expect(result.start.get("hour")).toBe(17);
291
345
 
292
- expect(result.text).toBe(text);
293
- result.start.imply("timezoneOffset", 60);
346
+ // However, when implying the output timezone to be GMT+0900,
347
+ result.start.imply("timezoneOffset", 540);
348
+ expect(result).toBeDate(new Date("Mon Nov 30 2020 17:00:00 GMT+0900 (JST)"));
349
+ }
350
+ {
351
+ // In PST (Sat Nov 28 2020 21:24:13 GMT-0700), the "tomorrow" is 'Nov 29 2020'
352
+ const text = "tomorrow at 5pm";
353
+ const result = chrono.parse(text, { instant: refInstant, timezone: -7 * 60 })[0] as ParsingResult;
354
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 17:00:00 GMT-0700 (PST)"));
355
+ expect(result.start.get("month")).toBe(11);
356
+ expect(result.start.get("day")).toBe(29);
357
+ expect(result.start.get("hour")).toBe(17);
294
358
 
295
- expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
296
- expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
359
+ // However, when implying the output timezone to be GMT+0900,
360
+ result.start.imply("timezoneOffset", 540);
361
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 17:00:00 GMT+0900 (JST)"));
297
362
  }
363
+ });
298
364
 
365
+ test("Test - Relative date when the timezone is relevant and known (2nd scenario)", () => {
366
+ // Thu Feb 27 2025 17:00:00 GMT+0000
367
+ // Thu Feb 27 2025 09:00:00 GMT-0800 (PST)
368
+ const refInstant = new Date("2025-02-27T17:00:00.000Z");
299
369
  {
300
- const text = "in 20 minutes";
301
- const result = chrono.parse(text, { instant: refDate, timezone: null })[0] as ParsingResult;
302
-
303
- expect(result.text).toBe(text);
304
- expect(result.start.isCertain("timezoneOffset")).toBe(false);
370
+ const text = "tomorrow at 9am";
371
+ const result = chrono.parse(text, { instant: refInstant, timezone: "PST" })[0] as ParsingResult;
372
+ expect(result).toBeDate(new Date("Fri Feb 28 2025 09:00:00 GMT-0800 (PST)"));
373
+ expect(result).toBeDate(new Date("2025-02-28T17:00:00.000Z"));
374
+ }
375
+ {
376
+ const text = "in 2 weeks at 9am";
377
+ const result = chrono.parse(text, { instant: refInstant, timezone: "PST" })[0] as ParsingResult;
378
+ expect(result).toBeDate(new Date("Thu Mar 13 2025 09:00:00 GMT-0800 (PST)"));
379
+ expect(result).toBeDate(new Date("2025-03-13T17:00:00.000Z"));
380
+ }
381
+ {
382
+ const text = "2 weeks ago at 9am";
383
+ const result = chrono.parse(text, { instant: refInstant, timezone: "PST" })[0] as ParsingResult;
384
+ expect(result).toBeDate(new Date("Thu Feb 13 2025 09:00:00 GMT-0800 (PST)"));
385
+ expect(result).toBeDate(new Date("2025-02-13T17:00:00.000Z"));
386
+ }
387
+ {
388
+ const text = "next friday at 9am";
389
+ const result = chrono.parse(text, { instant: refInstant, timezone: "PST" })[0] as ParsingResult;
390
+ expect(result).toBeDate(new Date("Fri Mar 07 2025 09:00:00 GMT-0800 (PST)"));
391
+ expect(result).toBeDate(new Date("2025-03-07T17:00:00.000Z"));
305
392
  }
306
393
  });
@@ -456,24 +456,13 @@ test("Test - Parsing negative cases : 'at [some numbers] - [some numbers]' (Stri
456
456
  testUnexpectedResult(chrono.strict, "7-730");
457
457
  });
458
458
 
459
- test("Test - forward dates only option", function () {
460
- testSingleCase(
461
- chrono,
462
- "1am",
463
- {
464
- instant: new Date("Wed May 26 2022 01:57:00 GMT-0500 (CDT)"),
465
- timezone: "CDT",
466
- },
467
- {
468
- forwardDate: true,
469
- },
470
- (result) => {
471
- expect(result.start.get("year")).toBe(2022);
472
- expect(result.start.get("month")).toBe(5);
473
- expect(result.start.get("day")).toBe(27);
474
- expect(result.start.get("hour")).toBe(1);
475
- }
476
- );
459
+ test("Test - Forward time calculation 'forwardDate' flag", () => {
460
+ testSingleCase(chrono, "1am", new Date(2022, 5 - 1, 26, 1, 57), { forwardDate: true }, (result) => {
461
+ expect(result.start.get("year")).toBe(2022);
462
+ expect(result.start.get("month")).toBe(5);
463
+ expect(result.start.get("day")).toBe(27);
464
+ expect(result.start.get("hour")).toBe(1);
465
+ });
477
466
 
478
467
  testSingleCase(chrono, "11am", new Date(2016, 10 - 1, 1, 12), { forwardDate: true }, (result) => {
479
468
  expect(result.start.get("year")).toBe(2016);
@@ -508,3 +497,23 @@ test("Test - forward dates only option", function () {
508
497
  expect(result.end.get("hour")).toBe(12);
509
498
  });
510
499
  });
500
+
501
+ test("Test - Test - Forward time calculation 'forwardDate' flag in different timezones", () => {
502
+ testSingleCase(
503
+ chrono,
504
+ "1am",
505
+ {
506
+ instant: new Date("Wed May 26 2022 01:57:00 GMT-0500 (CDT)"),
507
+ timezone: "CDT",
508
+ },
509
+ {
510
+ forwardDate: true,
511
+ },
512
+ (result) => {
513
+ expect(result.start.get("year")).toBe(2022);
514
+ expect(result.start.get("month")).toBe(5);
515
+ expect(result.start.get("day")).toBe(27);
516
+ expect(result.start.get("hour")).toBe(1);
517
+ }
518
+ );
519
+ });
@@ -10,6 +10,14 @@ test("Test - Single Expression", function () {
10
10
  expect(result.text).toBe("きょう");
11
11
  expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
12
12
  });
13
+ testSingleCase(chrono.ja, "本日はお日柄もよく", new Date(2012, 8 - 1, 10, 12), (result) => {
14
+ expect(result.text).toBe("本日");
15
+ expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
16
+ });
17
+ testSingleCase(chrono.ja, "ほんじつはお日柄もよく", new Date(2012, 8 - 1, 10, 12), (result) => {
18
+ expect(result.text).toBe("ほんじつ");
19
+ expect(result.start).toBeDate(new Date(2012, 8 - 1, 10, 12));
20
+ });
13
21
 
14
22
  testSingleCase(chrono.ja, "昨日の全国観測値ランキング", new Date(2012, 8 - 1, 10, 12), (result) => {
15
23
  expect(result.text).toBe("昨日");
@@ -213,4 +213,23 @@ test("Test - Range Expression", function () {
213
213
 
214
214
  expect(result.end).toBeDate(new Date(2014, 1 - 1, 7, 12));
215
215
  });
216
+
217
+ testSingleCase(chrono.ja, "2013年12月26日 ~ 2014年1月7日", new Date(2012, 8 - 1, 10), (result) => {
218
+ expect(result.index).toBe(0);
219
+ expect(result.text).toBe("2013年12月26日 ~ 2014年1月7日");
220
+
221
+ expect(result.start).not.toBeNull();
222
+ expect(result.start.get("year")).toBe(2013);
223
+ expect(result.start.get("month")).toBe(12);
224
+ expect(result.start.get("day")).toBe(26);
225
+
226
+ expect(result.start).toBeDate(new Date(2013, 12 - 1, 26, 12));
227
+
228
+ expect(result.end).not.toBeNull();
229
+ expect(result.end.get("year")).toBe(2014);
230
+ expect(result.end.get("month")).toBe(1);
231
+ expect(result.end.get("day")).toBe(7);
232
+
233
+ expect(result.end).toBeDate(new Date(2014, 1 - 1, 7, 12));
234
+ });
216
235
  });
@@ -185,42 +185,58 @@ test("Test - Relative date components' certainty", () => {
185
185
  });
186
186
  });
187
187
 
188
- test("Test - Relative date components' certainty and imply timezone", () => {
188
+ test("Test - Relative date when the timezone is irrelevant", () => {
189
189
  const refDate = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
190
-
191
190
  {
192
191
  // now
193
192
  const text = "nu";
194
193
  const result = chrono.nl.parse(text, refDate)[0] as ParsingResult;
194
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)"));
195
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 5:24:13 GMT+0100"));
195
196
 
196
- expect(result.text).toBe(text);
197
197
  result.start.imply("timezoneOffset", 60);
198
-
199
198
  expect(result).toBeDate(new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)"));
200
199
  expect(result).toBeDate(new Date("Sun Nov 29 2020 5:24:13 GMT+0100"));
201
200
  }
202
-
203
201
  {
204
- // tomorrow at 5pm
205
- const text = "morgen om 17 uur";
202
+ // in 10 minutes
203
+ const text = "binnen 10 minuten";
206
204
  const result = chrono.nl.parse(text, refDate)[0] as ParsingResult;
205
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
206
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
207
207
 
208
- expect(result.text).toBe(text);
209
208
  result.start.imply("timezoneOffset", 60);
210
-
211
- expect(result).toBeDate(new Date("Sun Dec 1 2020 1:00:00 GMT+0900 (Japan Standard Time)"));
212
- expect(result).toBeDate(new Date("Sun Nov 30 2020 17:00:00 GMT+0100"));
209
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
210
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
213
211
  }
212
+ });
214
213
 
214
+ test("Test - Relative date when the timezone is relevant and known", () => {
215
+ // Sun Nov 29 2020 13:24:13 GMT+0900 (JST)
216
+ // Sat Nov 28 2020 21:24:13 GMT-0700 (PDT)
217
+ const refInstant = new Date("Sun Nov 29 2020 13:24:13 GMT+0900 (Japan Standard Time)");
215
218
  {
216
- // in 10 minutes
217
- const text = "binnen 10 minuten";
218
- const result = chrono.nl.parse(text, refDate)[0] as ParsingResult;
219
+ // In JST (Nov 29 2020 13:24:13 GMT+0900), "tomorrow at 5pm"
220
+ const text = "morgen om 17 uur";
221
+ const result = chrono.nl.parse(text, { instant: refInstant, timezone: "JST" })[0] as ParsingResult;
222
+ expect(result).toBeDate(new Date("Mon Nov 30 2020 17:00:00 GMT+0900 (JST)"));
223
+ expect(result.start.get("month")).toBe(11);
224
+ expect(result.start.get("day")).toBe(30);
225
+ expect(result.start.get("hour")).toBe(17);
219
226
 
220
- expect(result.text).toBe(text);
221
227
  result.start.imply("timezoneOffset", 60);
228
+ expect(result).toBeDate(new Date("Mon Nov 30 2020 17:00:00 GMT+0100 (BST)"));
229
+ }
230
+ {
231
+ // In PDT (Sat Nov 28 2020 21:24:13 GMT-0700), "tomorrow at 5pm"
232
+ const text = "morgen om 17 uur";
233
+ const result = chrono.nl.parse(text, { instant: refInstant, timezone: -7 * 60 })[0] as ParsingResult;
234
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 17:00:00 GMT-0700 (PST)"));
235
+ expect(result.start.get("month")).toBe(11);
236
+ expect(result.start.get("day")).toBe(29);
237
+ expect(result.start.get("hour")).toBe(17);
222
238
 
223
- expect(result).toBeDate(new Date("Sun Nov 29 2020 13:34:13 GMT+0900 (Japan Standard Time)"));
224
- expect(result).toBeDate(new Date("Sun Nov 29 2020 5:34:13 GMT+0100"));
239
+ result.start.imply("timezoneOffset", 60);
240
+ expect(result).toBeDate(new Date("Sun Nov 29 2020 17:00:00 GMT+0100 (BST)"));
225
241
  }
226
242
  });
@@ -175,3 +175,27 @@ test("Test - Checking non-existing date during DST skip", () => {
175
175
  ).toBe(true);
176
176
  }
177
177
  });
178
+
179
+ test("Test - Getting timezone adjust date from references", () => {
180
+ {
181
+ const reference = new ReferenceWithTimezone({
182
+ instant: new Date("Wed Jun 09 2021 07:21:32 GMT+0900 (JST)"),
183
+ timezone: 9 * 60,
184
+ });
185
+ expect(reference.getDateWithAdjustedTimezone()).toStrictEqual(new Date(2021, 6 - 1, 9, 7, 21, 32));
186
+ }
187
+ {
188
+ const reference = new ReferenceWithTimezone({
189
+ instant: new Date("Wed Jun 09 2021 07:21:32 GMT+0900 (JST)"),
190
+ timezone: "JST",
191
+ });
192
+ expect(reference.getDateWithAdjustedTimezone()).toStrictEqual(new Date(2021, 6 - 1, 9, 7, 21, 32));
193
+ }
194
+ {
195
+ const reference = new ReferenceWithTimezone({
196
+ instant: new Date("Wed Jun 09 2021 07:21:32 GMT-0500 (CDT)"),
197
+ timezone: "CDT",
198
+ });
199
+ expect(reference.getDateWithAdjustedTimezone()).toStrictEqual(new Date(2021, 6 - 1, 9, 7, 21, 32));
200
+ }
201
+ });
@@ -1,7 +1,7 @@
1
1
  import * as chrono from "../src/";
2
2
  import { testSingleCase } from "./test_util";
3
3
 
4
- test("Test - Timezone difference on reference example", function () {
4
+ test("Test - Using reference with timezone", function () {
5
5
  testSingleCase(
6
6
  chrono,
7
7
  "Friday at 4pm",
@@ -11,12 +11,26 @@ test("Test - Timezone difference on reference example", function () {
11
11
  },
12
12
  (result) => {
13
13
  expect(result).toBeDate(new Date("Fri Jun 11 2021 16:00:00 GMT-0500 (CDT)"));
14
- expect(result).toBeDate(new Date("Fri Jun 12 2021 06:00:00 GMT+0900 (JST)"));
14
+ expect(result).toBeDate(new Date("Sat Jun 12 2021 06:00:00 GMT+0900 (JST)"));
15
+ }
16
+ );
17
+ testSingleCase(
18
+ chrono,
19
+ "1am",
20
+ {
21
+ instant: new Date("Wed May 26 2022 01:57:00 GMT-0500 (CDT)"),
22
+ timezone: "CDT",
23
+ },
24
+ (result) => {
25
+ expect(result.start.get("year")).toBe(2022);
26
+ expect(result.start.get("month")).toBe(5);
27
+ expect(result.start.get("day")).toBe(26);
28
+ expect(result.start.get("hour")).toBe(1);
15
29
  }
16
30
  );
17
31
  });
18
32
 
19
- test("Test - Timezone difference on default timezone", function () {
33
+ test("Test - Using reference with missing/default timezone", function () {
20
34
  const INPUT = "Friday at 4pm";
21
35
  const REF_INSTANT = new Date(2021, 6 - 1, 9, 7, 0, 0);
22
36
  const EXPECTED_INSTANT = new Date(2021, 6 - 1, 11, 16, 0, 0);
@@ -38,16 +52,18 @@ test("Test - Timezone difference on default timezone", function () {
38
52
  });
39
53
  });
40
54
 
41
- test("Test - Timezone difference on reference date", function () {
55
+ test("Test - Using reference instance with different timezone", function () {
42
56
  // Sun Jun 06 2021 19:00:00 GMT+0900 (JST)
43
57
  // Sun Jun 06 2021 11:00:00 GMT+0100 (BST)
44
58
  const refInstant = new Date("Sun Jun 06 2021 19:00:00 GMT+0900 (JST)");
45
59
 
60
+ // "At 4pm tomorrow" at "Sun Jun 06 2021 11:00:00 (BST)"
46
61
  testSingleCase(chrono, "At 4pm tomorrow", { instant: refInstant, timezone: "BST" }, (result) => {
47
62
  const expectedInstant = new Date("Mon Jun 07 2021 16:00:00 GMT+0100 (BST)");
48
63
  expect(result).toBeDate(expectedInstant);
49
64
  });
50
65
 
66
+ // "At 4pm tomorrow" at "Sun Jun 06 2021 19:00:00 (JST)"
51
67
  testSingleCase(chrono, "At 4pm tomorrow", { instant: refInstant, timezone: "JST" }, (result) => {
52
68
  const expectedInstant = new Date("Mon Jun 07 2021 16:00:00 GMT+0900 (JST)");
53
69
  expect(result).toBeDate(expectedInstant);