diff options
Diffstat (limited to 'packages/shared/utils')
| -rw-r--r-- | packages/shared/utils/relativeDateUtils.ts | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/packages/shared/utils/relativeDateUtils.ts b/packages/shared/utils/relativeDateUtils.ts new file mode 100644 index 00000000..437c3ea8 --- /dev/null +++ b/packages/shared/utils/relativeDateUtils.ts @@ -0,0 +1,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 }; |
