aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared/utils/relativeDateUtils.ts
blob: 437c3ea8b2f019e70ca70b6ca9647e1a5beae2c1 (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 = date.match(/^([<>])(\d+)([dwmy])$/);
  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 };