import { DateTime } from 'luxon'; /** * Parses a date string using multiple Luxon formats with fallback to JavaScript Date parsing. * Preserves timezone information when available using setZone: true. * * @param dateString - The date string to parse * @returns A parsed DateTime object */ export function parseDate(dateString: string): DateTime { // Try to parse as ISO format first (most common) let dateTime = DateTime.fromISO(dateString, { setZone: true }); // If ISO parsing fails, try other common formats if (!dateTime.isValid) { dateTime = DateTime.fromRFC2822(dateString, { setZone: true }); } if (!dateTime.isValid) { dateTime = DateTime.fromHTTP(dateString, { setZone: true }); } if (!dateTime.isValid) { dateTime = DateTime.fromSQL(dateString, { setZone: true }); } // If all parsing attempts fail, try JavaScript Date parsing as fallback if (!dateTime.isValid) { const jsDate = new Date(dateString); if (!isNaN(jsDate.getTime())) { dateTime = DateTime.fromJSDate(jsDate); } } return dateTime; } /** * Generates a standardized error message for date parsing failures. * * @param dateString - The original date string that failed to parse * @param dateTime - The invalid DateTime object * @param fieldName - Optional field name for more specific error messages (e.g., "start date", "end date") * @returns A formatted error message */ export function getDateParseErrorMessage( dateString: string, dateTime: DateTime, fieldName: string = 'date' ): string { return `Error: Unable to parse ${fieldName} "${dateString}". Please provide a valid date format (ISO 8601, RFC 2822, SQL, or common date formats). Reason: ${dateTime.invalidReason}`; }