Fechas e internacionalización con Intl

Aprende a trabajar con fechas y dinero sin errores silenciosos: crea objetos Date fiables, formatea por locale con Intl y evita bugs típicos de zona horaria.

Cuando una app muestra fechas o precios, no basta con que el dato exista: debe verse correcto para la persona usuaria y su país.

`Date` te da el valor temporal; `Intl` te permite presentarlo con formato humano según locale y reglas regionales.

Si ignoras zona horaria y formato, aparecen bugs clásicos: días desplazados, meses invertidos o importes mal interpretados.

Objetivo de esta lección: formatear fechas y moneda de forma fiable, legible y reutilizable en proyectos reales.

  • No es estética: es precisión funcional para usuarios de distintos países.
  • Un mismo valor (`1234.56`) puede mostrarse como `1.234,56 €` en España o `$1,234.56` en EE. UU. Si formateas mal, el usuario interpreta mal el dato.
  • Con `Intl` defines reglas explícitas de locale y formato. Eso evita manipular strings manualmente y reduce errores de mantenimiento.
  • No todas las cadenas se parsean igual en todos los navegadores.
  • Prioriza formatos ISO (`YYYY-MM-DD` o `YYYY-MM-DDTHH:mm:ssZ`) y evita fechas ambiguas tipo `05/06/2026` cuando no controlas locale.

Por qué Intl importa en producto real

No es estética: es precisión funcional para usuarios de distintos países.

Un mismo valor (`1234.56`) puede mostrarse como `1.234,56 €` en España o `$1,234.56` en EE. UU. Si formateas mal, el usuario interpreta mal el dato.

Con `Intl` defines reglas explícitas de locale y formato. Eso evita manipular strings manualmente y reduce errores de mantenimiento.

Crear fechas sin sorpresas

No todas las cadenas se parsean igual en todos los navegadores.

Prioriza formatos ISO (`YYYY-MM-DD` o `YYYY-MM-DDTHH:mm:ssZ`) y evita fechas ambiguas tipo `05/06/2026` cuando no controlas locale.

Para inputs de fecha sin hora, una técnica útil es añadir `T12:00:00` para minimizar desplazamientos por zona horaria al renderizar.

  • Evita parsear formatos regionales manuales en lógica crítica.
  • Si recibes fecha del backend, documenta si llega en UTC o local.
  • No confíes en `new Date(texto)` con strings ambiguos.
  • Centraliza la conversión en funciones reutilizables.

Formatear fecha/hora con Intl.DateTimeFormat

Define locale y opciones para mostrar exactamente lo que necesitas.

`Intl.DateTimeFormat` transforma un objeto `Date` en texto adaptado al idioma y región. Así evitas concatenar día/mes/año a mano.

Para rendimiento y consistencia, puedes crear el formateador una vez y reutilizarlo en listas o tablas.

Formatear importes con Intl.NumberFormat

El símbolo no es suficiente: también importan separadores y decimales.

`Intl.NumberFormat` con `style: 'currency'` aplica reglas regionales completas para representar dinero de forma correcta.

Misma cifra, distinta salida según locale. Este detalle es esencial en ecommerce, facturación y paneles de analítica.

  • Moneda (`EUR`, `USD`, `MXN`) debe venir de negocio/configuración.
  • Evita concatenar símbolos manualmente (`'€' + total`).
  • Controla redondeos antes de mostrar si tu dominio lo requiere.
  • Reutiliza un helper para no duplicar reglas por toda la app.

Errores frecuentes y checklist profesional

La mayoría de problemas aparecen por ambigüedad de entrada o falta de contexto de zona horaria.

Si una fecha cambia de día al renderizar, revisa en qué zona se creó y en cuál se está mostrando. No es un bug aleatorio: es una conversión temporal.

Define convenciones de equipo (UTC en backend, locale en frontend, funciones compartidas) para evitar inconsistencias entre pantallas.

  • Entrada técnica estable (ISO/UTC), salida visual localizada.
  • Locale y currency explícitos en funciones de formato.
  • Nada de parseo ambiguo tipo `dd/mm/yyyy` sin normalización.
  • Pruebas con varios locales para detectar regresiones temprano.
JavaScript
20

Fechas e internacionalización con Intl

Aprende a trabajar con fechas y dinero sin errores silenciosos: crea objetos Date fiables, formatea por locale con Intl y evita bugs típicos de zona horaria.

Código del tema: Date · Intl.DateTimeFormat · Intl.NumberFormat

📘 Teoría

Por qué Intl importa en producto real

No es estética: es precisión funcional para usuarios de distintos países.

Un mismo valor (`1234.56`) puede mostrarse como `1.234,56 €` en España o `$1,234.56` en EE. UU. Si formateas mal, el usuario interpreta mal el dato.

Con `Intl` defines reglas explícitas de locale y formato. Eso evita manipular strings manualmente y reduce errores de mantenimiento.

1

Locale

2

Formato de fecha

3

Formato de moneda

4

Impacto

Crear fechas sin sorpresas

No todas las cadenas se parsean igual en todos los navegadores.

Prioriza formatos ISO (`YYYY-MM-DD` o `YYYY-MM-DDTHH:mm:ssZ`) y evita fechas ambiguas tipo `05/06/2026` cuando no controlas locale.

Para inputs de fecha sin hora, una técnica útil es añadir `T12:00:00` para minimizar desplazamientos por zona horaria al renderizar.

  • Evita parsear formatos regionales manuales en lógica crítica.
  • Si recibes fecha del backend, documenta si llega en UTC o local.
  • No confíes en `new Date(texto)` con strings ambiguos.
  • Centraliza la conversión en funciones reutilizables.
Construcción robusta
const fechaISO = '2026-02-14';
const fecha = new Date(`${fechaISO}T12:00:00`);

console.log('timestamp:', fecha.getTime());
console.log('iso:', fecha.toISOString());

Formatear fecha/hora con Intl.DateTimeFormat

Define locale y opciones para mostrar exactamente lo que necesitas.

1

`Intl.DateTimeFormat` transforma un objeto `Date` en texto adaptado al idioma y región. Así evitas concatenar día/mes/año a mano.

2

Para rendimiento y consistencia, puedes crear el formateador una vez y reutilizarlo en listas o tablas.

Fecha legible por locale
const fecha = new Date('2026-06-21T18:30:00Z');

const formateadorES = new Intl.DateTimeFormat('es-ES', {
  dateStyle: 'full',
  timeStyle: 'short',
  timeZone: 'Europe/Madrid'
});

console.log(formateadorES.format(fecha));

Formatear importes con Intl.NumberFormat

El símbolo no es suficiente: también importan separadores y decimales.

`Intl.NumberFormat` con `style: 'currency'` aplica reglas regionales completas para representar dinero de forma correcta.

Misma cifra, distinta salida según locale. Este detalle es esencial en ecommerce, facturación y paneles de analítica.

  • Moneda (`EUR`, `USD`, `MXN`) debe venir de negocio/configuración.
  • Evita concatenar símbolos manualmente (`'€' + total`).
  • Controla redondeos antes de mostrar si tu dominio lo requiere.
  • Reutiliza un helper para no duplicar reglas por toda la app.
Precio en varios locales
const total = 1234.56;

const es = new Intl.NumberFormat('es-ES', { style: 'currency', currency: 'EUR' });
const us = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });

console.log(es.format(total));
console.log(us.format(total));

Errores frecuentes y checklist profesional

La mayoría de problemas aparecen por ambigüedad de entrada o falta de contexto de zona horaria.

Si una fecha cambia de día al renderizar, revisa en qué zona se creó y en cuál se está mostrando. No es un bug aleatorio: es una conversión temporal.

Define convenciones de equipo (UTC en backend, locale en frontend, funciones compartidas) para evitar inconsistencias entre pantallas.

  • Entrada técnica estable (ISO/UTC), salida visual localizada.
  • Locale y currency explícitos en funciones de formato.
  • Nada de parseo ambiguo tipo `dd/mm/yyyy` sin normalización.
  • Pruebas con varios locales para detectar regresiones temprano.

🧪 Aprende probando

Ejemplo Ejemplo guiado: fecha segura desde input Convierte un valor `YYYY-MM-DD` a `Date` estable y muéstralo en formato local.
Ejemplo Ejemplo guiado: helper reutilizable de moneda Encapsula el formato para usarlo en tablas, tarjetas o facturas.
Ejemplo Demo interactiva: fecha + precio por locale Elige locale y moneda para ver cómo cambia la salida final.

🏁 Retos

Reto Reto 1: formato de ticket Formatea una fecha y un total para mostrar un resumen de compra legible.
Reto Reto 2: función resumirPedido Construye una función reusable que reciba locale/moneda y devuelva un mensaje listo para UI.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .