noticias·8 分で読める

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.

DevToolsHub Team
·
La Muerte de Date.parse(): Por Qué Usar Librerías de Fechas en 2026

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:

  1. 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)
    
  2. Formatos con hora sin zona horaria

    Date.parse('2024-06-19 14:30:00')  // ❌ NaN
    Date.parse('06/19/2024 2:30 PM')  // ❌ NaN
    
  3. Formatos 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.

#fechas#javascript#timestamps#parsing#deprecación

関連記事