Date.parse('12-Jan-2022');
works fine in Chrome/Edge, however, Firefox returns wrong date.
To parse the string in Firefox, I wrote my own parser in Typescript:
export function parseDate(ds: string): Date { const regexDateOnly = /^\d{1,2}-[ADFJMNOS]{1}[abceglnoprtuvy]{2}-\d{4}$/g; const regexDateTime = /^\d{1,2}-[ADFJMNOS]{1}[abceglnoprtuvy]{2}-\d{4} \d{2}:\d{2}:\d{2}$/g; const regexDateTimeMilliSecs = /^\d{1,2}-[ADFJMNOS]{1}[abceglnoprtuvy]{2}-\d{4} \d{2}:\d{2}:\d{2}\.\d{3}$/g; let datePart = ''; let timePart = ''; let millisPart = ''; if (regexDateTimeMilliSecs.test(ds)) { const parts1 = ds.split(' '); const parts2 = parts1[1].split('.'); datePart = parts1[0]; timePart = parts2[0]; millisPart = parts2[1]; } else if (regexDateTime.test(ds)) { const parts = ds.split(' '); datePart = parts[0]; timePart = parts[1]; } else if (regexDateOnly.test(ds)) { datePart = ds; } else { throw new Error(`Failed to parse date: ${ds}`) } let year = 1970, month = 0, day = 1, hour = 0, minute = 0, second = 0, millisecs = 0; if (datePart) { const parts = datePart.split('-'); day = parseInt(parts[0]); switch (parts[1].toLowerCase()) { case 'jan': month = 0; break; case 'feb': month = 1; break; case 'mar': month = 2; break; case 'apr': month = 3; break; case 'may': month = 4; break; case 'jun': month = 5; break; case 'jul': month = 6; break; case 'aug': month = 7; break; case 'sep': month = 8; break; case 'oct': month = 9; break; case 'nov': month = 10; break; case 'dec': month = 11; break; default: break; } year = parseInt(parts[2]); } if (timePart) { const parts = timePart.split(':'); hour = parseInt(parts[0]); minute = parseInt(parts[1]); second = parseInt(parts[2]); } if (millisPart) { millisecs = parseInt(millisPart); } return new Date(year, month, day, hour, minute, second, millisecs); }
No comments:
Post a Comment