blob: c450ea84ca01e3621a0893d95e3b9e3eddab4974 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
interface RelativeDate {
direction: "newer" | "older";
amount: number;
unit: "day" | "week" | "month" | "year";
}
const parseRelativeDate = (date: string): RelativeDate => {
const match = /^([<>])(\d+)([dwmy])$/.exec(date);
if (!match) {
throw new Error(`Invalid relative date format: ${date}`);
}
const direction = match[1] === "<" ? "newer" : "older";
const amount = parseInt(match[2], 10);
const unit = {
d: "day",
w: "week",
m: "month",
y: "year",
}[match[3]] as "day" | "week" | "month" | "year";
return { direction, amount, unit };
};
const toAbsoluteDate = (relativeDate: RelativeDate): Date => {
const date = new Date();
switch (relativeDate.unit) {
case "day":
date.setDate(date.getDate() - relativeDate.amount);
break;
case "week":
date.setDate(date.getDate() - relativeDate.amount * 7);
break;
case "month":
date.setMonth(date.getMonth() - relativeDate.amount);
break;
case "year":
date.setFullYear(date.getFullYear() - relativeDate.amount);
break;
}
return date;
};
export { parseRelativeDate, toAbsoluteDate };
|