Command Palette

Search for a command to run...

Internacionalización con Intl.DateTimeFormat

Aprende a formatear fechas y horas según diferentes configuraciones regionales e idiomas usando la API Intl.DateTimeFormat de JavaScript.

Lectura: 12 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • Intl.DateTimeFormat crea un formateador reutilizable: más eficiente que toLocaleString() para múltiples fechas
  • new Intl.DateTimeFormat('es-ES').format(fecha) formatea según idioma/región (España usa DD/MM/YYYY)
  • Opciones dateStyle/timeStyle son mutuamente excluyentes con opciones granulares (year/month/day)
  • timeZone: 'America/New_York' convierte fechas entre zonas (ej: UTC a hora local de NY)
  • Soporte de +600 locales pero disponibilidad varía por navegador: verifica con resolvedOptions()

Introducción a la Internacionalización

La internacionalización de fechas es un desafío común en aplicaciones web que atienden usuarios de diferentes países y culturas. Cada región tiene sus propias convenciones para mostrar fechas: en Estados Unidos se usa "MM/DD/YYYY", en Europa "DD/MM/YYYY", en Japón "YYYY年MM月DD日", y así sucesivamente. La API Intl.DateTimeFormat de JavaScript proporciona una solución nativa y eficiente para manejar estas diferencias sin necesidad de librerías externas.

Antes de ES2015 (ES6), los desarrolladores dependían de librerías como Moment.js o DateFormat para formatear fechas correctamente según el locale del usuario. Estas librerías agregaban peso adicional a la aplicación y requerían mantenimiento constante. Con la introducción de la API Intl en JavaScript, ahora podemos formatear fechas de manera nativa con soporte para más de 600 configuraciones regionales, incluyendo formatos de calendario, zonas horarias y convenciones culturales específicas.

Dato histórico

La API Intl fue introducida en ECMAScript Internationalization API Specification (ECMA-402) en 2012, pero el soporte completo de Intl.DateTimeFormat llegó con ES2015. Esta API fue diseñada para proporcionar funcionalidades de internacionalización de manera nativa en JavaScript, eliminando la necesidad de librerías de terceros para tareas comunes como formateo de fechas, números y monedas.

¿Qué es Intl.DateTimeFormat?

Intl.DateTimeFormat es un constructor que crea objetos formateadores de fecha y hora según configuraciones regionales específicas. A diferencia de los métodos como toLocaleString() que formatean una fecha específica, Intl.DateTimeFormat crea un formateador reutilizable que puedes aplicar a múltiples fechas, lo que lo hace más eficiente cuando necesitas formatear muchas fechas con el mismo formato.

La API Intl.DateTimeFormat detecta automáticamente las preferencias del navegador del usuario, incluyendo el idioma, el formato de fecha y la zona horaria. Esto significa que puedes mostrar fechas en el formato preferido del usuario sin necesidad de configuración explícita, aunque también puedes especificar el locale y las opciones manualmente si necesitas un formato específico.

Sintaxis Básica

La sintaxis básica de Intl.DateTimeFormat acepta dos parámetros opcionales: el locale (configuración regional) y un objeto de opciones que define cómo se debe formatear la fecha. Si no proporcionas ningún parámetro, usa el locale del navegador del usuario.

intl-datetimeformat.js
Loading code...

El constructor Intl.DateTimeFormat crea un objeto formateador que puedes usar con el método format() para convertir una fecha en una string formateada. Cuando no especificas un locale, JavaScript usa automáticamente el locale del navegador del usuario, lo que hace que las fechas se muestren en el formato preferido del usuario sin configuración adicional.

Mejor práctica

Usa Intl.DateTimeFormat cuando necesites formatear múltiples fechas con el mismo formato. Crear un formateador una vez y reutilizarlo es más eficiente que llamar a toLocaleString() en cada fecha, ya que Intl.DateTimeFormat cachea el formato y evita el overhead de analizar las opciones en cada llamada.

Formateo de Fechas

Intl.DateTimeFormat permite controlar qué componentes de la fecha se muestran y en qué formato. Puedes especificar si quieres mostrar el día de la semana, el año, el mes y el día, y cómo quieres que se muestre cada componente (completo, corto, numérico, etc.). Esto te da control total sobre el formato de la fecha mientras mantienes la consistencia con las convenciones culturales del locale.

intl-formato-fecha.js
Loading code...

Las opciones de formato de fecha te permiten controlar qué componentes se muestran y cómo se formatean. Por ejemplo, weekday puede ser "long" (ej: "lunes"), "short" (ej: "lun") o "narrow" (ej: "L"), mientras que year, month y day pueden ser "numeric" (ej: "2025", "1", "15") o "2-digit" (ej: "25", "01", "15"). Estas opciones se aplican automáticamente según las convenciones del locale especificado.

  • <strong>weekday</strong>: 'long' | 'short' | 'narrow' - Día de la semana
  • <strong>year</strong>: 'numeric' | '2-digit' - Año completo o dos dígitos
  • <strong>month</strong>: 'long' | 'short' | 'narrow' | 'numeric' | '2-digit' - Mes en diferentes formatos
  • <strong>day</strong>: 'numeric' | '2-digit' - Día del mes

Formateo de Hora

Además de formatear fechas, Intl.DateTimeFormat también puede formatear horas con control sobre los componentes de hora, minutos, segundos y el período del día (AM/PM). La API maneja automáticamente las convenciones de formato de hora de cada locale, incluyendo el uso de formato de 12 o 24 horas según sea apropiado para la región.

intl-formato-hora.js
Loading code...

Las opciones de hora incluyen hour, minute, second y hour12. El formato de 12 o 24 horas se determina automáticamente según el locale, pero puedes forzar un formato específico usando la opción hour12. Por ejemplo, en Estados Unidos se usa formato de 12 horas con AM/PM, mientras que en muchos países europeos se usa formato de 24 horas.

Convenciones culturales

Intl.DateTimeFormat respeta las convenciones culturales de cada locale. Por ejemplo, en español de España se usa "15:30" para las 3:30 PM, mientras que en español de México se usa "3:30 p.m.". Estas diferencias se manejan automáticamente sin que necesites configurarlas manualmente.

Opciones de Configuración

Intl.DateTimeFormat ofrece muchas opciones de configuración para personalizar el formato de fecha y hora. Puedes controlar qué componentes se muestran, cómo se formatean, e incluso especificar el calendario y el sistema de numeración a usar. Estas opciones te permiten crear formatos personalizados mientras mantienes la consistencia con las convenciones culturales.

intl-opciones.js
Loading code...

Las opciones de configuración te permiten controlar el formato de fecha y hora en detalle. La opción dateStyle y timeStyle proporcionan formatos predefinidos ('full', 'long', 'medium', 'short') que siguen las convenciones del locale, mientras que las opciones individuales (weekday, year, month, etc.) te dan control granular sobre cada componente. Puedes combinar estas opciones según tus necesidades.

  • <strong>dateStyle</strong>: 'full' | 'long' | 'medium' | 'short' - Estilo predefinido de fecha
  • <strong>timeStyle</strong>: 'full' | 'long' | 'medium' | 'short' - Estilo predefinido de hora
  • <strong>calendar</strong>: 'gregory' | 'buddhist' | 'chinese' | etc. - Sistema de calendario
  • <strong>numberingSystem</strong>: 'arab' | 'hans' | 'latn' | etc. - Sistema de numeración

Locales Diferentes

Uno de los mayores beneficios de Intl.DateTimeFormat es el soporte para múltiples locales. Puedes especificar un locale específico usando etiquetas de idioma BCP 47 (como 'es-ES' para español de España, 'en-US' para inglés de Estados Unidos, 'ja-JP' para japonés de Japón) o proporcionar un array de locales para usar el primero disponible. Esto te permite mostrar fechas en el formato apropiado para diferentes usuarios.

intl-locales.js
Loading code...

Las etiquetas de locale BCP 47 consisten en un código de idioma (como 'es' para español) seguido opcionalmente de un código de país (como 'ES' para España). Puedes especificar múltiples locales en un array, y JavaScript usará el primero que esté disponible. Esto es útil cuando quieres proporcionar un fallback en caso de que el locale preferido no esté soportado.

Advertencia importante

No todos los navegadores soportan todos los locales. Si especificas un locale que no está disponible, JavaScript usará un locale de fallback (generalmente el locale del navegador o 'en-US'). Siempre verifica que el formato resultante sea el esperado, especialmente cuando usas locales menos comunes.

Zona Horaria

Intl.DateTimeFormat puede formatear fechas en diferentes zonas horarias usando la opción timeZone. Esto es especialmente útil en aplicaciones que atienden usuarios de diferentes regiones, ya que puedes mostrar fechas en la zona horaria local del usuario sin necesidad de conversiones manuales. La API soporta todas las zonas horarias de la base de datos IANA (como 'America/New_York', 'Europe/London', 'Asia/Tokyo').

intl-zona-horaria.js
Loading code...

La opción timeZone te permite especificar la zona horaria en la que quieres formatear la fecha. La fecha subyacente no cambia, pero el formato se ajusta a la zona horaria especificada. Esto es diferente de cambiar la fecha en sí, ya que solo afecta cómo se muestra la fecha, no su valor interno. La API maneja automáticamente los cambios de horario de verano y otras excepciones de zona horaria.

Dato técnico

Las zonas horarias se especifican usando identificadores IANA (Internet Assigned Numbers Authority), como 'America/Bogota', 'Europe/Madrid', 'Asia/Tokyo'. Estos identificadores son más precisos que los offsets de zona horaria (como UTC-5) porque incluyen información sobre cambios de horario de verano y excepciones históricas.

Resumen: Internacionalización con Intl.DateTimeFormat

Conceptos principales:

  • Intl.DateTimeFormat es la API nativa de JavaScript para formatear fechas según diferentes locales
  • Soporta más de 600 configuraciones regionales con formatos automáticos de fecha y hora
  • Puedes personalizar el formato usando opciones como weekday, year, month, day, hour, minute, second
  • La API maneja automáticamente diferencias de zona horaria y convenciones culturales
  • Es más eficiente que toLocaleString() cuando necesitas formatear múltiples fechas con el mismo formato
  • Las etiquetas de locale BCP 47 consisten en código de idioma y opcionalmente código de país

Mejores prácticas:

  • Usa Intl.DateTimeFormat cuando necesites formatear múltiples fechas con el mismo formato
  • Especifica el locale explícitamente cuando necesites un formato específico para una región
  • Usa las opciones dateStyle y timeStyle para formatos predefinidos que siguen las convenciones del locale
  • Verifica que el formato resultante sea el esperado, especialmente con locales menos comunes
  • Usa la opción timeZone para mostrar fechas en la zona horaria local del usuario
  • Proporciona un array de locales para usar el primero disponible como fallback