Skip to content

Commit bedbe9c

Browse files
committed
fix: Date parser returns 31 days for last 30 days date range
Fixes #303
1 parent 18c2fea commit bedbe9c

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

packages/cubejs-api-gateway/dateParser.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@ module.exports = (dateString, timezone) => {
1919
const match = dateString.match(/last\s+(\d+)\s+(day|week|month|year|quarter|hour|minute|second)/);
2020
const span = match[2] === 'week' ? 'isoWeek' : match[2];
2121
momentRange = [
22-
moment.tz(timezone).add(-parseInt(match[1], 10) - 1, match[2]).startOf(span),
23-
moment.tz(timezone).add(-1, match[2]).endOf(span)
22+
moment.tz(timezone).startOf(span).add(-parseInt(match[1], 10), match[2]),
23+
moment.tz(timezone).endOf(span).add(-1, match[2])
2424
];
2525
} else if (dateString.match(/today/)) {
2626
momentRange = [moment.tz(timezone).startOf('day'), moment.tz(timezone).endOf('day')];
2727
} else if (dateString.match(/yesterday/)) {
28-
const yesterday = moment.tz(timezone).add(-1, 'day');
29-
momentRange = [moment(yesterday).startOf('day'), moment(yesterday).endOf('day')];
28+
momentRange = [
29+
moment.tz(timezone).startOf('day').add(-1, 'day'),
30+
moment.tz(timezone).endOf('day').add(-1, 'day')
31+
];
3032
} else {
3133
const results = chrono.parse(dateString);
3234
if (!results) {

packages/cubejs-api-gateway/dateParser.test.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,26 @@ describe(`dateParser`, () => {
99
);
1010
});
1111

12+
test(`last 1 day`, () => {
13+
expect(dateParser('last 1 day', 'UTC')).toStrictEqual(
14+
[dateParser('yesterday', 'UTC')[0], dateParser('yesterday', 'UTC')[1]]
15+
);
16+
});
17+
18+
test(`today`, () => {
19+
const start = new Date();
20+
const end = new Date();
21+
start.setUTCHours(0, 0, 0, 0);
22+
end.setUTCHours(23, 59, 59, 999);
23+
expect(dateParser('today', 'UTC')).toStrictEqual(
24+
[start.toISOString().replace('Z', ''), end.toISOString().replace('Z', '')]
25+
);
26+
});
27+
1228
test(`last 6 hours`, () => {
1329
expect(dateParser('last 6 hours', 'UTC')).toStrictEqual(
1430
[
15-
new Date((Math.floor(new Date().getTime() / (1000 * 60 * 60)) - 7) * (1000 * 60 * 60)).toISOString().replace('Z', ''),
31+
new Date((Math.floor(new Date().getTime() / (1000 * 60 * 60)) - 6) * (1000 * 60 * 60)).toISOString().replace('Z', ''),
1632
new Date((Math.floor(new Date().getTime() / (1000 * 60 * 60))) * (1000 * 60 * 60) - 1).toISOString().replace('Z', '')
1733
]
1834
);

0 commit comments

Comments
 (0)