2025-07-21 23:49:09 -06:00
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.
2025-07-23 00:08:00 -06:00
*
2025-07-21 23:49:09 -06:00
* @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 } ) ;
2025-07-23 00:08:00 -06:00
2025-07-21 23:49:09 -06:00
// If ISO parsing fails, try other common formats
if ( ! dateTime . isValid ) {
dateTime = DateTime . fromRFC2822 ( dateString , { setZone : true } ) ;
}
2025-07-23 00:08:00 -06:00
2025-07-21 23:49:09 -06:00
if ( ! dateTime . isValid ) {
dateTime = DateTime . fromHTTP ( dateString , { setZone : true } ) ;
}
2025-07-23 00:08:00 -06:00
2025-07-21 23:49:09 -06:00
if ( ! dateTime . isValid ) {
dateTime = DateTime . fromSQL ( dateString , { setZone : true } ) ;
}
2025-07-23 00:08:00 -06:00
2025-07-21 23:49:09 -06:00
// 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 ) ;
}
}
2025-07-23 00:08:00 -06:00
2025-07-21 23:49:09 -06:00
return dateTime ;
}
/ * *
* Generates a standardized error message for date parsing failures .
2025-07-23 00:08:00 -06:00
*
2025-07-21 23:49:09 -06:00
* @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 (
2025-07-23 00:08:00 -06:00
dateString : string ,
dateTime : DateTime ,
fieldName : string = 'date' ,
2025-07-21 23:49:09 -06:00
) : 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 } ` ;
}