const isValidDate = (date: string | Date) => !isNaN(Date.parse('' + date)) const createIsoParser = (regex: RegExp) => (dateStr: string) => { const match = typeof dateStr === 'string' && dateStr.match(regex) return match ? // tslint:disable-next-line new Date(Date.UTC(+match[1], +match[2] - 1, +match[3] || 0, +match[4] + parseInt(match[8], 10) || 0, +match[5] || 0, +match[6] || 0, parseInt(match[7], 10) || 0)) : null } // tslint:disable-next-line const regexIso8601 = /^(\d{4}|\+\d{6})(?:-?(\d{2})(?:-?(\d{2})(?:T(\d{2})(?::?(\d{2})(?::?(\d{2})(?:(?:\.|,)(\d{1,}))?)?)?(Z|([\-+])(\d{2})(?::?(\d{2}))?)?)?)?)?$/ export const parseDateIso8601 = createIsoParser(regexIso8601) export const naiveParser = (dateStr: string) => { const date = new Date(dateStr) return isValidDate(date) ? date : null } export const parseDate = (dateStr: Date | string) => // list of date-parsers we need (typeof dateStr === 'string' && ( naiveParser(dateStr) || parseDateIso8601(dateStr) )) || dateStr // final fallback to the string / date