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