Tengo una cadena, que puede venir en diferentes formatos:
01.01.2020
01/01/2020
01-01-2020
o
2020-01-01
2020.01.01
2020/01/01
Ahora si trato de hacer
const date = new Date(myDateString);En algunos casos, obtendré un error "Fecha no válida". ¿Cómo puedo cubrir todos los escenarios y transformar cualquier escenario en una fecha válida?
Parece que la nueva Fecha(), ¿solo toma el formato Ymy?, aunque los otros casos también son fechas "válidas".
Puede dividir la cadena en los delimitadores conocidos y luego ver si la primera parte tiene cuatro dígitos. Si es así, sabes que es año-mes-día. Si no, sabes que es mes-día-año. A continuación, puede construir la fecha en consecuencia:
const dateStrings = [ "10.31.2020", "10/31/2020", "10-31-2020", "2020-10-31", "2020.10.31", "2020/10/31", ] function parseDateStr(str) { // split on dots, dashes, and slashes const parts = str.split(/[./-]/); // mm-dd-yyyy const [year, month, day] = parts[0].length > 2 ? parts : [parts[2], parts[0], parts[1]]; // alternate for dd-mm-yyyy // const [year, month, day] = parts[0].length > 2 ? parts : parts.reverse(); // construct and return the date. (month is 0 based) return new Date(year, month - 1, day); } const results = dateStrings.map(parseDateStr); console.log(results);Puedes momento para hacer eso. Pero necesita saber qué formato se utiliza.
El constructor Date() es preciso si sus parámetros son YYYY , MM , DD . Las fechas del 1 de enero de 2020 deberían ser así:
new Date(2020, 0, 1) // Month is 0 index, so MM -1 Dada una matriz de cadenas .map() y split() cada una por delimitadores .-/ , lo que da como resultado sub-matrices de 3 cadenas de cada cadena:
strArr.map(str => str.split(/[-./]/)) luego .flatMap() para capturar cualquier matriz que comience con 2 dígitos y .reverse() :
.flatMap(sub => sub[0].length === 2 ? [sub.reverse()] : [sub]) Finalmente, .flatMap() cada subarreglo en el constructor Date() :
.flatMap(sub => [new Date(+sub[0], +sub[1] - 1, +sub[2])]) const jan1_2020 = [ `01.01.2020`, `01/01/2020`, `01-01-2020`, `2020-01-01`, `2020.01.01`, `2020/01/01` ]; const formatDate = strArr => strArr.map(str => str.split(/[-./]/)).flatMap(sub => sub[0].length === 2 ? [sub.reverse()] : [sub]).flatMap(sub => [new Date(+sub[0], +sub[1] - 1, +sub[2])]); let x = formatDate(jan1_2020); console.log(x);