/** * Parse a time string, which can be either an ISO date or a relative time like -30m, -1h, -1d * @param timeStr Time string to parse * @returns Timestamp in milliseconds */ export function parseTimeString(timeStr?: string): number | undefined { if (!timeStr) { return undefined; } // Current time const now = new Date(); // If it's a relative time (e.g., -30m, -1h, -1d) if (timeStr.startsWith('-')) { // Extract the time value and unit const timeValue = timeStr.substring(1, timeStr.length - 1); const timeUnit = timeStr.charAt(timeStr.length - 1); const timeValueNum = parseInt(timeValue); if (isNaN(timeValueNum)) { throw new Error(`Invalid time value in ${timeStr}`); } // Calculate the time ago based on the unit switch (timeUnit) { case 'm': // minutes return now.getTime() - timeValueNum * 60 * 1000; case 'h': // hours return now.getTime() - timeValueNum * 60 * 60 * 1000; case 'd': // days return now.getTime() - timeValueNum * 24 * 60 * 60 * 1000; default: throw new Error(`Invalid time unit in ${timeStr}`); } } else { // It's an ISO date string const date = new Date(timeStr); if (isNaN(date.getTime())) { throw new Error(`Invalid date string: ${timeStr}`); } return date.getTime(); } } /** * Get a date from a timestamp * @param timestamp Timestamp in milliseconds * @returns Date object */ export function getDateFromTimestamp(timestamp?: number): Date | undefined { if (!timestamp) { return undefined; } return new Date(timestamp); } /** * Format a timestamp as ISO string * @param timestamp Timestamp in milliseconds * @returns ISO string or undefined */ export function formatTimestamp(timestamp?: number): string | undefined { if (!timestamp) { return undefined; } return new Date(timestamp).toISOString(); } /** * Get a default time range * @param defaultMinutesAgo Default minutes to go back * @returns Object with start and end timestamps */ export function getDefaultTimeRange(defaultMinutesAgo = 30): { startTime: number; endTime?: number } { const now = new Date(); return { startTime: now.getTime() - defaultMinutesAgo * 60 * 1000, endTime: undefined // Current time }; }