chrono-node 2.7.9 → 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.
- package/dist/cjs/common/casualReferences.js +8 -10
- package/dist/cjs/common/casualReferences.js.map +1 -1
- package/dist/cjs/common/refiners/ForwardDateRefiner.js +33 -12
- package/dist/cjs/common/refiners/ForwardDateRefiner.js.map +1 -1
- package/dist/cjs/results.d.ts +1 -0
- package/dist/cjs/results.js +18 -13
- package/dist/cjs/results.js.map +1 -1
- package/dist/cjs/utils/dates.d.ts +3 -0
- package/dist/cjs/utils/dates.js +17 -0
- package/dist/cjs/utils/dates.js.map +1 -0
- package/dist/cjs/utils/dayjs.js.map +1 -1
- package/dist/esm/common/casualReferences.js +8 -10
- package/dist/esm/common/casualReferences.js.map +1 -1
- package/dist/esm/common/refiners/ForwardDateRefiner.js +14 -12
- package/dist/esm/common/refiners/ForwardDateRefiner.js.map +1 -1
- package/dist/esm/results.d.ts +1 -0
- package/dist/esm/results.js +17 -13
- package/dist/esm/results.js.map +1 -1
- package/dist/esm/utils/dates.d.ts +3 -0
- package/dist/esm/utils/dates.js +12 -0
- package/dist/esm/utils/dates.js.map +1 -0
- package/dist/esm/utils/dayjs.js.map +1 -1
- package/package.json +1 -1
- package/src/common/casualReferences.ts +8 -10
- package/src/common/refiners/ForwardDateRefiner.ts +17 -11
- package/src/results.ts +18 -13
- package/src/utils/dates.ts +24 -0
- package/src/utils/dayjs.ts +6 -0
- package/test/en/en_casual.test.ts +4 -1
- package/test/en/en_relative.test.ts +126 -39
- package/test/en/en_time_exp.test.ts +27 -18
- package/test/nl/nl_relative.test.ts +33 -17
- package/test/result.test.ts +24 -0
- package/test/system_timezone.test.ts +20 -4
package/dist/esm/results.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/results.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,KAAoB,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,OAAO,qBAAqB;IAI9B,YAAY,KAA+B;QACvC,KAAK,GAAG,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,KAAK,YAAY,IAAI,EAAE;YACvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/results.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function implySimilarDate(component, target) {
|
|
2
|
+
component.imply("day", target.getDate());
|
|
3
|
+
component.imply("month", target.getMonth() + 1);
|
|
4
|
+
component.imply("year", target.getFullYear());
|
|
5
|
+
}
|
|
6
|
+
export function implySimilarTime(component, target) {
|
|
7
|
+
component.imply("hour", target.getHours());
|
|
8
|
+
component.imply("minute", target.getMinutes());
|
|
9
|
+
component.imply("second", target.getSeconds());
|
|
10
|
+
component.imply("millisecond", target.getMilliseconds());
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=dates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dates.js","sourceRoot":"","sources":["../../../src/utils/dates.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,gBAAgB,CAAC,SAA4B,EAAE,MAAY;IACvE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACzC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAChD,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AAClD,CAAC;AAOD,MAAM,UAAU,gBAAgB,CAAC,SAA4B,EAAE,MAAY;IACvE,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/C,SAAS,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dayjs.js","sourceRoot":"","sources":["../../../src/utils/dayjs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,UAAU,gBAAgB,CAAC,SAA4B,EAAE,WAAwB;IACnF,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1C,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAA4B,EAAE,WAAwB;IAClF,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA4B,EAAE,WAAwB;IACpF,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA4B,EAAE,WAAwB;IACpF,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE;QAC5B,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;KAC7C;SAAM;QACH,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;KAC7C;AACL,CAAC;
|
|
1
|
+
{"version":3,"file":"dayjs.js","sourceRoot":"","sources":["../../../src/utils/dayjs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,UAAU,gBAAgB,CAAC,SAA4B,EAAE,WAAwB;IACnF,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1C,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAA4B,EAAE,WAAwB;IAClF,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA4B,EAAE,WAAwB;IACpF,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA4B,EAAE,WAAwB;IACpF,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE;QAC5B,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;KAC7C;SAAM;QACH,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;KAC7C;AACL,CAAC;AAKD,MAAM,UAAU,gBAAgB,CAAC,SAA4B,EAAE,WAAwB;IACnF,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC;AAKD,MAAM,UAAU,gBAAgB,CAAC,SAA4B,EAAE,WAAwB;IACnF,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,SAAS,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9D,CAAC"}
|
package/package.json
CHANGED
|
@@ -10,19 +10,17 @@ import {
|
|
|
10
10
|
import { Meridiem } from "../types";
|
|
11
11
|
|
|
12
12
|
export function now(reference: ReferenceWithTimezone): ParsingComponents {
|
|
13
|
-
const targetDate = dayjs(reference.
|
|
13
|
+
const targetDate = dayjs(reference.getDateWithAdjustedTimezone());
|
|
14
14
|
const component = new ParsingComponents(reference, {});
|
|
15
15
|
assignSimilarDate(component, targetDate);
|
|
16
16
|
assignSimilarTime(component, targetDate);
|
|
17
|
-
|
|
18
|
-
component.assign("timezoneOffset", targetDate.utcOffset());
|
|
19
|
-
}
|
|
17
|
+
component.assign("timezoneOffset", reference.getTimezoneOffset());
|
|
20
18
|
component.addTag("casualReference/now");
|
|
21
19
|
return component;
|
|
22
20
|
}
|
|
23
21
|
|
|
24
22
|
export function today(reference: ReferenceWithTimezone): ParsingComponents {
|
|
25
|
-
const targetDate = dayjs(reference.
|
|
23
|
+
const targetDate = dayjs(reference.getDateWithAdjustedTimezone());
|
|
26
24
|
const component = new ParsingComponents(reference, {});
|
|
27
25
|
assignSimilarDate(component, targetDate);
|
|
28
26
|
implySimilarTime(component, targetDate);
|
|
@@ -49,7 +47,7 @@ export function tomorrow(reference: ReferenceWithTimezone): ParsingComponents {
|
|
|
49
47
|
}
|
|
50
48
|
|
|
51
49
|
export function theDayAfter(reference: ReferenceWithTimezone, nDays: number): ParsingComponents {
|
|
52
|
-
let targetDate = dayjs(reference.
|
|
50
|
+
let targetDate = dayjs(reference.getDateWithAdjustedTimezone());
|
|
53
51
|
const component = new ParsingComponents(reference, {});
|
|
54
52
|
targetDate = targetDate.add(nDays, "day");
|
|
55
53
|
assignSimilarDate(component, targetDate);
|
|
@@ -58,7 +56,7 @@ export function theDayAfter(reference: ReferenceWithTimezone, nDays: number): Pa
|
|
|
58
56
|
}
|
|
59
57
|
|
|
60
58
|
export function tonight(reference: ReferenceWithTimezone, implyHour = 22): ParsingComponents {
|
|
61
|
-
const targetDate = dayjs(reference.
|
|
59
|
+
const targetDate = dayjs(reference.getDateWithAdjustedTimezone());
|
|
62
60
|
const component = new ParsingComponents(reference, {});
|
|
63
61
|
assignSimilarDate(component, targetDate);
|
|
64
62
|
component.imply("hour", implyHour);
|
|
@@ -68,7 +66,7 @@ export function tonight(reference: ReferenceWithTimezone, implyHour = 22): Parsi
|
|
|
68
66
|
}
|
|
69
67
|
|
|
70
68
|
export function lastNight(reference: ReferenceWithTimezone, implyHour = 0): ParsingComponents {
|
|
71
|
-
let targetDate = dayjs(reference.
|
|
69
|
+
let targetDate = dayjs(reference.getDateWithAdjustedTimezone());
|
|
72
70
|
const component = new ParsingComponents(reference, {});
|
|
73
71
|
if (targetDate.hour() < 6) {
|
|
74
72
|
targetDate = targetDate.add(-1, "day");
|
|
@@ -87,7 +85,7 @@ export function evening(reference: ReferenceWithTimezone, implyHour = 20): Parsi
|
|
|
87
85
|
}
|
|
88
86
|
|
|
89
87
|
export function yesterdayEvening(reference: ReferenceWithTimezone, implyHour = 20): ParsingComponents {
|
|
90
|
-
let targetDate = dayjs(reference.
|
|
88
|
+
let targetDate = dayjs(reference.getDateWithAdjustedTimezone());
|
|
91
89
|
const component = new ParsingComponents(reference, {});
|
|
92
90
|
targetDate = targetDate.add(-1, "day");
|
|
93
91
|
assignSimilarDate(component, targetDate);
|
|
@@ -100,7 +98,7 @@ export function yesterdayEvening(reference: ReferenceWithTimezone, implyHour = 2
|
|
|
100
98
|
|
|
101
99
|
export function midnight(reference: ReferenceWithTimezone): ParsingComponents {
|
|
102
100
|
const component = new ParsingComponents(reference, {});
|
|
103
|
-
const targetDate = dayjs(reference.
|
|
101
|
+
const targetDate = dayjs(reference.getDateWithAdjustedTimezone());
|
|
104
102
|
if (targetDate.hour() > 2) {
|
|
105
103
|
// Unless it's very early morning (0~2AM), we assume the midnight is the coming midnight.
|
|
106
104
|
// Thus, increasing the day by 1.
|
|
@@ -8,6 +8,7 @@ import { ParsingContext, Refiner } from "../../chrono";
|
|
|
8
8
|
import { ParsingResult } from "../../results";
|
|
9
9
|
import dayjs from "dayjs";
|
|
10
10
|
import { implySimilarDate } from "../../utils/dayjs";
|
|
11
|
+
import * as dates from "../../utils/dates";
|
|
11
12
|
|
|
12
13
|
export default class ForwardDateRefiner implements Refiner {
|
|
13
14
|
refine(context: ParsingContext, results: ParsingResult[]): ParsingResult[] {
|
|
@@ -16,21 +17,26 @@ export default class ForwardDateRefiner implements Refiner {
|
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
results.forEach((result) => {
|
|
19
|
-
let refMoment = dayjs(context.
|
|
20
|
+
let refMoment = dayjs(context.reference.getDateWithAdjustedTimezone());
|
|
20
21
|
|
|
21
|
-
if (result.start.isOnlyTime() &&
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
if (result.start.isOnlyTime() && context.reference.instant > result.start.date()) {
|
|
23
|
+
const refDate = context.reference.getDateWithAdjustedTimezone();
|
|
24
|
+
const refFollowingDay = new Date(refDate);
|
|
25
|
+
refFollowingDay.setDate(refFollowingDay.getDate() + 1);
|
|
26
|
+
|
|
27
|
+
dates.implySimilarDate(result.start, refFollowingDay);
|
|
28
|
+
context.debug(() => {
|
|
29
|
+
console.log(
|
|
30
|
+
`${this.constructor.name} adjusted ${result} time from the ref date (${refDate}) to the following day (${refFollowingDay})`
|
|
31
|
+
);
|
|
32
|
+
});
|
|
24
33
|
if (result.end && result.end.isOnlyTime()) {
|
|
25
|
-
implySimilarDate(result.end,
|
|
26
|
-
if (result.start.
|
|
27
|
-
|
|
28
|
-
implySimilarDate(result.end,
|
|
34
|
+
dates.implySimilarDate(result.end, refFollowingDay);
|
|
35
|
+
if (result.start.date() > result.end.date()) {
|
|
36
|
+
refFollowingDay.setDate(refFollowingDay.getDate() + 1);
|
|
37
|
+
dates.implySimilarDate(result.end, refFollowingDay);
|
|
29
38
|
}
|
|
30
39
|
}
|
|
31
|
-
context.debug(() => {
|
|
32
|
-
console.log(`${this.constructor.name} adjusted ${result} time result (${result.start})`);
|
|
33
|
-
});
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) {
|
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
|
-
|
|
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 =
|
|
66
|
-
this.imply("day", refDayJs.
|
|
67
|
-
this.imply("month", refDayJs.
|
|
68
|
-
this.imply("year", refDayJs.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
225
|
-
components.assign("timezoneOffset", -reference.instant.getTimezoneOffset());
|
|
226
|
-
}
|
|
233
|
+
components.assign("timezoneOffset", reference.getTimezoneOffset());
|
|
227
234
|
} else {
|
|
228
235
|
implySimilarTime(components, date);
|
|
229
|
-
|
|
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
|
+
}
|
package/src/utils/dayjs.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
|
|
257
|
-
|
|
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
|
-
|
|
260
|
-
|
|
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
|
-
|
|
263
|
-
expect(result).toBeDate(new Date("Sun Nov
|
|
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
|
-
|
|
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
|
-
|
|
271
|
-
result.
|
|
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
|
-
|
|
274
|
-
|
|
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
|
-
|
|
279
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
290
|
-
const
|
|
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
|
-
|
|
293
|
-
result.start.imply("timezoneOffset",
|
|
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
|
-
|
|
296
|
-
|
|
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 = "
|
|
301
|
-
const result = chrono.parse(text, { instant:
|
|
302
|
-
|
|
303
|
-
expect(result
|
|
304
|
-
|
|
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 -
|
|
460
|
-
testSingleCase(
|
|
461
|
-
|
|
462
|
-
"
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
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
|
+
});
|