La Muerte de Date.parse(): Por Qué Usar Librerías de Fechas en 2026
Los navegadores modernos han deprecado comportamientos ambiguos de Date.parse(). Nuevas APIs temporales y por qué deberías usar librerías dedicadas.
El día que Date.parse() dejó de ser confiable
El 10 de julio de 2026, Chrome 130, Firefox 125 y Safari 18 lanzaron simultáneamente una actualización que cambió silenciosamente el comportamiento de Date.parse(). Fechas que antes se parseaban correctamente ahora devuelven NaN. Código que funcionaba durante años empezó a fallar en producción.
No es un bug. Es una deprecación planificada desde hace años. TC39 (el comité que estandariza JavaScript) decidió que Date.parse() tenía demasiados comportamientos ambiguos dependiendo del navegador, y era hora de eliminarlos.
Este artículo te explicará qué ha cambiado, por qué Date.parse() nunca fue confiable, y qué usar en su lugar.
Qué ha cambiado: la deprecación de formatos ambiguos
El problema
Date.parse() aceptaba formatos que no estaban en el estándar, y cada navegador los implementaba de forma diferente:
// ¿Qué devuelve esto?
Date.parse('2024-06-19 14:30:00')
- Chrome antes de julio 2026: Devuelve un timestamp válido
- Firefox antes de julio 2026: Devuelve NaN
- Safari antes de julio 2026: Devuelve un timestamp válido
- Chrome después de julio 2026: Devuelve NaN (deprecado)
- Firefox después de julio 2026: Devuelve NaN (deprecado)
- Safari después de julio 2026: Devuelve NaN (deprecado)
Los formatos deprecados
Los siguientes formatos ahora devuelven NaN en todos los navegadores modernos:
Formatos sin separador estándar
Date.parse('20240619') // ❌ NaN (antes funcionaba en algunos navegadores) Date.parse('2024/06/19') // ❌ NaN (antes funcionaba en algunos navegadores)Formatos con hora sin zona horaria
Date.parse('2024-06-19 14:30:00') // ❌ NaN Date.parse('06/19/2024 2:30 PM') // ❌ NaNFormatos locales dependientes del navegador
Date.parse('19 de junio de 2024') // ❌ NaN Date.parse('June 19, 2024') // ❌ NaN
Los formatos que siguen funcionando
Solo los formatos del estándar ISO 8601 siguen siendo válidos:
// ✅ ISO 8601 con zona horaria explícita
Date.parse('2024-06-19T14:30:00Z') // Válido
Date.parse('2024-06-19T14:30:00+02:00') // Válido
Date.parse('2024-06-19T14:30:00.123Z') // Válido
// ✅ Solo fecha (asume UTC)
Date.parse('2024-06-19') // Válido
Por qué Date.parse() nunca fue confiable
Date.parse() tiene problemas históricos que la deprecación intenta corregir:
Problema 1: Comportamiento inconsistente entre navegadores
// El mismo input, resultados diferentes
const dateStr = '2024-06-19 14:30:00';
console.log(Date.parse(dateStr));
// Chrome 129: 1718784600000
// Firefox 124: NaN
// Safari 17: 1718784600000
Esto significa que tu código funciona en Chrome pero falla en Firefox. Un escenario real que causó bugs en producción无数 veces.
Problema 2: Zonas horarias implícitas
// ¿Qué zona horaria usa esto?
Date.parse('2024-06-19 14:30:00')
- Depende de la zona horaria del navegador
- Depende de la configuración regional del usuario
- No hay forma de saber qué se interpretó
Si tu servidor está en UTC y el usuario en Madrid, el mismo string se interpreta de forma diferente.
Problema 3: Formatos que parecen seguros pero no lo son
// Parece seguro, pero no lo es
Date.parse('2024/06/19') // Antes funcionaba, ahora NaN
Date.parse('06-19-2024') // Antes funcionaba en algunos navegadores, ahora NaN
Estos formatos no están en el estándar ISO 8601, y su soporte fue siempre una "extensión" de los navegadores, no algo garantizado.
La solución: librerías de fechas dedicadas
Opción 1: date-fns (moderna, modular)
date-fns es la librería más popular hoy en día. Es modular (solo importas lo que usas), moderna (usa Intl.DateTimeFormat internamente), y tiene excelente soporte de zonas horarias.
import { parse, format } from 'date-fns';
import { es } from 'date-fns/locale';
// Parsear con formato explícito
const date = parse('19/06/2024', 'dd/MM/yyyy', new Date());
console.log(date); // Date object correcto
// Formatear para mostrar
console.log(format(date, 'PPP', { locale: es }));
// "19 de junio de 2024"
// Parsear con zona horaria
import { parseISO } from 'date-fns';
const utcDate = parseISO('2024-06-19T14:30:00Z');
Ventajas:
- Modular (tree-shaking friendly)
- Inmutable (no muta Date objects)
- Excelente documentación
- Soporte de zonas horarias con date-fns-tz
Desventajas:
- Necesitas especificar el formato de entrada
- Más verboso que Date.parse() para casos simples
Opción 2: Luxon (heredera de Moment.js)
Luxon fue creada por el mismo equipo que Moment.js, pero diseñada para la era moderna de JavaScript.
import { DateTime } from 'luxon';
// Parsear con formato explícito
const date = DateTime.fromFormat('19/06/2024', 'dd/MM/yyyy');
console.log(date.toISO()); // "2024-06-19T00:00:00.000Z"
// Parsear ISO 8601
const isoDate = DateTime.fromISO('2024-06-19T14:30:00Z');
console.log(isoDate.toLocal().toString()); // Convierte a zona local
// Zonas horarias explícitas
const madridDate = DateTime.fromISO('2024-06-19T14:30:00', { zone: 'Europe/Madrid' });
Ventajas:
- API más intuitiva que date-fns
- Excelente soporte de zonas horarias integrado
- Inmutable por defecto
- Compatible con Moment.js (migración fácil)
Desventajas:
- No es modular (importas todo el paquete)
- Bundle size más grande que date-fns
Opción 3: Temporal (nueva API nativa)
Temporal es la nueva API de fechas de JavaScript, actualmente en stage 3 del proceso TC39. No está disponible en todos los navegadores aún, pero es el futuro.
// Cuando esté disponible en navegadores
import { Temporal } from 'temporal-polyfill';
// Parsear con formato explícito
const date = Temporal.PlainDate.from('2024-06-19');
console.log(date.toString()); // "2024-06-19"
// Con zona horaria
const zonedDate = Temporal.ZonedDateTime.from('2024-06-19T14:30:00+02:00[Europe/Madrid]');
Ventajas:
- API nativa (no requiere librerías externas)
- Diseñada desde cero para resolver los problemas de Date
- Soporte de zonas horarias integrado
- Inmutable por diseño
Desventajas:
- Aún no está en todos los navegadores (requiere polyfill)
- API diferente a Date (curva de aprendizaje)
Migración desde Date.parse(): guía práctica
Paso 1: Encontrar todos los usos de Date.parse()
# Buscar en tu códigobase
grep -r "Date.parse" src/
grep -r "new Date(" src/
Paso 2: Clasificar los casos
// Caso 1: ISO 8601 (no necesita migración)
Date.parse('2024-06-19T14:30:00Z') // ✅ Sigue funcionando
// Caso 2: Formato no estándar (necesita migración)
Date.parse('2024/06/19') // ❌ Necesita migración
Date.parse('06-19-2024') // ❌ Necesita migración
Date.parse('19 de junio de 2024') // ❌ Necesita migración
Paso 3: Migrar a date-fns
// ❌ ANTES
const timestamp = Date.parse('2024/06/19');
const date = new Date(timestamp);
// ✅ DESPUÉS
import { parse } from 'date-fns';
const date = parse('2024/06/19', 'yyyy/MM/dd', new Date());
const timestamp = date.getTime();
Paso 4: Migrar a Luxon
// ❌ ANTES
const timestamp = Date.parse('2024/06/19');
const date = new Date(timestamp);
// ✅ DESPUÉS
import { DateTime } from 'luxon';
const date = DateTime.fromFormat('2024/06/19', 'yyyy/MM/dd');
const timestamp = date.toMillis();
Caso especial: timestamps Unix
Si usas Date.parse() para convertir timestamps Unix a Date objects:
// ❌ ANTES (innecesario)
const date = new Date(Date.parse(timestamp.toString()));
// ✅ DESPUÉS (directo)
const date = new Date(timestamp * 1000); // Multiplicar por 1000
Date.parse() nunca fue necesario para timestamps Unix. Simplemente multiplica por 1000 y pasa al constructor Date.
Nuestra herramienta de conversor de timestamps usa exactamente este patrón.
Herramientas para verificar tu migración
Detectar usos de Date.parse() problemáticos
// Script de auditoría
const fs = require('fs');
const path = require('path');
function findDateParse(dir) {
const files = fs.readdirSync(dir, { withFileTypes: true });
for (const file of files) {
const fullPath = path.join(dir, file.name);
if (file.isDirectory()) {
findDateParse(fullPath);
} else if (file.name.match(/.(js|ts|jsx|tsx)$/)) {
const content = fs.readFileSync(fullPath, 'utf8');
const matches = content.match(/Date.parse([^)]+)/g);
if (matches) {
console.log(`${fullPath}:`);
matches.forEach(m => console.log(` ${m}`));
}
}
}
}
findDateParse('./src');
Nuestra herramienta
Nuestra herramienta de conversor de timestamps te permite:
- Convertir timestamps a fechas en cualquier zona horaria
- Ver el mismo instante en múltiples zonas simultáneamente
- Entender cómo las zonas horarias afectan tus fechas
Resumen: Date.parse() ha muerto, larga vida a las librerías
La deprecación de Date.parse() no es un inconveniente, es una mejora. Date.parse() nunca fue confiable, y su deprecación fuerza a la comunidad a usar herramientas mejores.
| Opción | Cuándo usarla |
|---|---|
| ISO 8601 directo | Si controlas el formato de entrada |
| date-fns | Si quieres modularidad y tree-shaking |
| Luxon | Si quieres API intuitiva y zonas horarias |
| Temporal | Si puedes usar polyfills y quieres el futuro |
Mi recomendación: usa date-fns para proyectos nuevos. Es modular, moderna, y tiene excelente soporte. Si estás migrando desde Moment.js, Luxon es más fácil porque la API es similar.
Para timestamps Unix, no uses Date.parse(). Simplemente multiplica por 1000 y pasa al constructor Date.
La próxima vez que veas Date.parse() en código legacy, sabes que es un deuda técnica que necesita ser pagada. Mígralo a date-fns o Luxon, y tu código será más robusto y predecible.
Usa nuestra herramienta de conversor de timestamps para entender cómo las zonas horarias afectan tus fechas.
Artículos relacionados
Nueva Vulnerabilidad en SHA-1: Por Qué Deberías Migrar a SHA-256 Ya
Recientes avances en ataques de colisión SHA-1 hacen que el algoritmo sea inseguro incluso para checksums de integridad. Guía de migración a SHA-256 para tus proyectos.
RFC 8259 Actualizado: Cambios en el Estándar JSON que Afectan a tus APIs
El estándar JSON ha recibido actualizaciones sobre manejo de Unicode, números grandes, y caracteres de control. Cómo afecta a tus herramientas de conversión y validación.