¿Qué posibilidades hay para analizar una cadena ISO de una fecha en Javascript, si la fecha también puede ser BC?
Tengo fechas de Wikidata que se ven así, por ejemplo (pero también son posibles otros formatos ISO): -0709-01-01T00:00:00Z
Esto es demasiado antiguo para Date.parse, e incluso las bibliotecas como Luxon o Moment no pueden hacer nada aquí.
Me gustaría poder consultar año, mes, día, hora y minuto en una zona horaria deseada.
Ahora podría hacer esto creando una expresión regular y analizando la cadena con ella, pero con las muchas variaciones posibles, veo el peligro de no incluir todo.
Tampoco he encontrado una expresión regular en Internet que pueda manejar todo.
¿Alguien conoce una biblioteca u otra solución que pueda usar aquí?
"-0709-01-01T00:00:00Z" no es coherente con elformato definido en ECMA-262, por lo que el análisis depende de la implementación.
Según ECMA-262, donde el año tiene un signo (es decir, precedido por + o -), debe usar el formato de año expandido y tener 6 dígitos, por ejemplo
new Date('-000709-01-01T00:00:00Z')funciona en Safari, Firefox y Chrome al menos.
Entonces puede analizar la cadena usted mismo o expandir el año a 6 dígitos. Este último requiere análisis y reformateo, por lo que también podría analizarlo y evitar el analizador integrado yendo directamente al constructor, por ejemplo.
function parseUTC(d) { let [Y, M, D, H, m, s] = d.match(/\d+/g); let sign = /^-/.test(d)? -1 : 1; return new Date(Date.UTC(sign*Y, M-1, D, H, m, s)); } let d = '-0709-01-01T00:00:00Z'; // -000709-01-01T00:00:00.000Z console.log(parseUTC(d).toISOString()); // Alternatively… console.log(new Date(d.replace(/^-/,'-00')).toISOString());Mientras que el segundo método "funciona", creo que el primer método es más robusto ya que no depende de la cantidad de dígitos del año, mientras que el segundo asume que son 4 dígitos y no maneja decir "+2020-10-23T00: 00:00Z".