HOWTO · JavaScript
Convertir una cadena en una fecha en JavaScript
Este tutorial enumera varias formas en JavaScript para convertir una cadena en una fecha.
En esta página
Las cadenas de fecha procedentes de una base de datos o una API siguen siendo cadenas, por lo que un selector de fechas o un cálculo puede necesitar un objeto JavaScript Date. La conversión adecuada depende del formato de entrada y de si se especifica la zona horaria. Pasa la cadena como argumento a new Date(dateString) para analizar una cadena estándar compatible; la llamada sin argumentos new Date() crea un objeto Date con la hora actual. Usa Date.parse() cuando necesites milisegundos, o analiza los componentes por tu cuenta si conoces el formato personalizado.
Esta guía presenta tres opciones prácticas:
- Pasa una cadena de fecha compatible a
new Date(dateString)para crear un objetoDate. - Llama a
Date.parse()cuando te resulte útil obtener un valor numérico en milisegundos. - Divide una cadena con un formato personalizado conocido en componentes antes de crear un objeto
Date.
Usar new Date() para convertir una cadena en una fecha en JavaScript
El constructor new Date(dateString) acepta una cadena de fecha compatible y devuelve un objeto Date. Esta marca de tiempo ISO 8601 incluye Z, que indica UTC. Al llamar a toISOString(), se obtiene esa hora UTC independientemente de la zona horaria local del equipo.
const dateString = '2024-05-23T14:30:00Z';
const date = new Date(dateString);
console.log(date instanceof Date);
console.log(date.toISOString());
Una cadena que contiene solo una fecha, como 2024-05-23, se interpreta como UTC, mientras que una cadena de fecha y hora sin desplazamiento se interpreta como hora local. Si el valor de origen representa un instante concreto, usa una cadena estándar con un desplazamiento explícito para que su interpretación no dependa de la zona local del equipo.
La interpretación de formatos ajenos al formato estándar de fecha y hora no está definida de forma coherente en todas las implementaciones de JavaScript. Una cadena que acepta un navegador o entorno de ejecución puede interpretarse de otra manera en otro. Antes de usar el objeto resultante, compruébalo con Number.isNaN(date.getTime()). Que el análisis tenga éxito tampoco demuestra que la cadena respete el formato o las reglas del calendario que exige tu aplicación; valida esos requisitos por separado.
Usar Date.parse() para analizar una cadena de fecha en JavaScript
Date.parse() devuelve el número de milisegundos transcurridos desde la época Unix para una cadena de fecha que puede analizar, o NaN si no puede interpretarla. Devuelve un número, no un objeto Date. Para un valor de una API, analízalo y, si necesitas un objeto, crea una fecha a partir del resultado numérico:
const apiValue = '2019-01-01T12:30:00.000Z';
const milliseconds = Date.parse(apiValue);
console.log(typeof milliseconds);
console.log(Number.isNaN(milliseconds) ? 'not parsed' : new Date(milliseconds).toISOString());
Number.isNaN() detecta la señal de error del análisis, pero no valida por completo un formato específico de la aplicación. Un entorno de ejecución podría aceptar un valor que tu aplicación debería rechazar. Si la entrada debe seguir un patrón concreto, comprueba ese patrón y los valores del calendario antes de usar el resultado del análisis.
Dividir una cadena y convertirla en una fecha en JavaScript
Cuando una entrada usa un formato personalizado conocido, divídela según ese formato y pasa sus componentes al constructor Date con varios argumentos. Este ejemplo espera el formato DD-MM-YYYYTHH:mm:ss; el constructor interpreta los componentes como hora local. Devuelve null si los componentes no forman una fecha válida del calendario.
function parseKnownDate(value) {
if (typeof value !== 'string') {
return null;
}
const dateTimeParts = value.split('T');
if (dateTimeParts.length !== 2) {
return null;
}
const [datePart, timePart] = dateTimeParts;
if (
!/^\d{2}-\d{2}-\d{4}$/.test(datePart) ||
!/^\d{2}:\d{2}:\d{2}$/.test(timePart)
) {
return null;
}
const dateParts = datePart.split('-');
const timeParts = timePart.split(':');
if (dateParts.length !== 3 || timeParts.length !== 3) {
return null;
}
const [day, month, year] = dateParts.map(Number);
const [hours, minutes, seconds] = timeParts.map(Number);
if (![day, month, year, hours, minutes, seconds].every(Number.isInteger)) {
return null;
}
// The multi-argument constructor treats years 0–99 as 1900–1999.
// setFullYear preserves the supplied year, including values in that range.
const date = new Date(0);
date.setFullYear(year, month - 1, day);
date.setHours(hours, minutes, seconds, 0);
if (
date.getFullYear() !== year ||
date.getMonth() !== month - 1 ||
date.getDate() !== day ||
date.getHours() !== hours ||
date.getMinutes() !== minutes ||
date.getSeconds() !== seconds
) {
return null;
}
return date;
}
const date = parseKnownDate('21-03-2020T11:20:30');
console.log(date === null ? 'not a valid date' : date.toString());
Las divisiones dependen del orden de componentes indicado; ajústalas si el origen usa otro orden o separador. El argumento del mes empieza en cero, así que el código resta uno al mes expresado en formato legible. Los métodos de asignación usan la hora local y pueden normalizar valores fuera de rango; comparar los componentes resultantes con los valores analizados permite detectar esa normalización. La fecha inicial se basa en la zona horaria local, por lo que este método crea un valor de hora local, no una marca de tiempo UTC. Si puede haber años entre 0 y 99, setFullYear() evita el tratamiento especial que el constructor con varios argumentos aplica a esos años. Este ejemplo comprueba que los componentes sean enteros y detecta el desbordamiento del calendario; si tu aplicación impone reglas de entrada más estrictas, comprueba también el patrón exacto de la cadena y los rangos permitidos para cada campo.
Conclusión
Pasa una cadena de fecha compatible a new Date(dateString) para crear un objeto Date; si representa un instante concreto, es preferible que incluya un desplazamiento explícito. La llamada sin argumentos new Date() crea un Date con la hora actual; no analiza una cadena. Usa Date.parse() cuando necesites los milisegundos transcurridos desde la época Unix o su señal de error NaN; si necesitas un objeto Date, pasa el número obtenido correctamente a new Date(milliseconds). Para un formato personalizado conocido, analiza y valida sus componentes antes de crear una fecha con hora local. La descripción general de ISO 8601 explica la representación de fechas y horas que usan muchas API.