Date, zonas horarias e Intl en JavaScript | Nicolás Garzón
Date representa principalmente un instante como milisegundos desde el epoch Unix. La zona horaria aparece al interpretar o presentar ese instante.
JavaScript
Copiar const date = new Date ( ) ;
date. getTime ( ) ;
Texto
Copiar Instante: punto único en la línea de tiempo
Fecha local: representación según zona y calendario2026-07-23 09:00 no identifica un instante completo sin zona horaria.
JavaScript
Copiar new Date ( "2026-07-23T14:00:00Z" ) ; JavaScript
Copiar new Date ( "2026-07-23T09:00:00-05:00" ) ; Ambos pueden representar el mismo instante.
JavaScript
Copiar new Date ( "07/08/2026" ) ; Puede ser ambiguo y no debería usarse como formato de intercambio.
Usa ISO definido o parsea componentes con una regla explícita.
JavaScript
Copiar new Date ( 2026 , 6 , 23 , 9 , 0 ) ; El mes comienza en cero. Esta forma utiliza la zona local del runtime.
JavaScript
Copiar const date = new Date ( value) ;
if ( Number. isNaN ( date. getTime ( ) ) ) {
throw new TypeError ( "Invalid date" ) ;
} Un objeto Date inválido sigue siendo instancia de Date.
JavaScript
Copiar date. getFullYear ( ) ;
date. getMonth ( ) ;
date. getDate ( ) ; JavaScript
Copiar date. getUTCFullYear ( ) ;
date. getUTCMonth ( ) ;
date. getUTCDate ( ) ; No mezcles getters locales y UTC dentro del mismo cálculo sin intención.
JavaScript
Copiar const date = new Date ( ) ;
date. setDate ( date. getDate ( ) + 1 ) ; Date es mutable. Para evitar cambios compartidos:
JavaScript
Copiar const copy = new Date ( date. getTime ( ) ) ; JavaScript
Copiar const durationMs = end. getTime ( ) - start. getTime ( ) ; Es apropiado para duración real entre instantes.
Agregar 24 horas no siempre equivale a “mañana a la misma hora local” en zonas con cambios de horario.
JavaScript
Copiar date. toISOString ( ) ; Produce representación UTC. Es útil para intercambio de instantes, no para preservar la zona original del usuario.
JavaScript
Copiar const formatter = new Intl. DateTimeFormat ( "es-CO" , {
dateStyle : "long" ,
timeStyle : "short" ,
timeZone : "America/Bogota" ,
} ) ;
formatter. format ( date) ; Separa almacenamiento de presentación.
JavaScript
Copiar new Intl. DateTimeFormat ( "es-CO" , {
timeZone : "America/Bogota" ,
} ) . format ( date) ; Usa identificadores IANA en vez de offsets fijos cuando necesitas reglas históricas y futuras de una región.
Orden de día, mes y año.
Nombres de meses.
Ciclo de 12 o 24 horas.
Numeración.
Calendario.
No construyas fechas para usuario concatenando partes manualmente.
JavaScript
Copiar const dateFormatter = new Intl. DateTimeFormat (
"es-CO" ,
{
dateStyle : "medium" ,
timeZone : "America/Bogota" ,
} ,
) ; Crear una instancia y reutilizarla puede ser más claro que repetir opciones.
JavaScript
Copiar first. getTime ( ) === second. getTime ( ) ;
first < second; === entre Dates compara referencias, no instantes.
Una fecha de cumpleaños como 2000-05-20 no es necesariamente un instante UTC. Convertirla automáticamente a Date puede mover el día al presentarla en otra zona.
Instante.
Fecha sin hora.
Hora local.
Zona horaria.
JavaScript
Copiar const event = {
startsAt : "2026-07-23T14:00:00Z" ,
timeZone : "America/Bogota" ,
} ;
const startsAt = new Date ( event. startsAt) ;
const label = new Intl. DateTimeFormat ( "es-CO" , {
dateStyle : "full" ,
timeStyle : "short" ,
timeZone : event. timeZone,
} ) . format ( startsAt) ; El instante y la zona de presentación se conservan como datos distintos.
Parsear fechas ambiguas.
Olvidar que month comienza en cero.
Comparar Dates con ===.
Mutar una Date compartida.
Mezclar getters UTC y locales.
Guardar una fecha sin hora como instante.
Añadir 24 horas esperando siempre el mismo horario local.
Concatenar formatos para usuarios manualmente.
Confundir offset con zona horaria.
Date almacena un instante en milisegundos.
La zona afecta interpretación y presentación.
Usa formatos de intercambio no ambiguos.
Comprueba getTime para validar.
Date es mutable.
toISOString usa UTC.
Intl.DateTimeFormat presenta según locale y zona.
Fecha civil e instante son conceptos diferentes.
¿Por qué guardar un cumpleaños como medianoche UTC puede mostrar el día anterior en otra zona?
Respuesta Porque lo convertiste en un instante. Al representarlo en una zona con offset negativo, ese instante puede corresponder todavía al día calendario anterior.
Expresiones regulares presenta patrones para buscar, validar y transformar texto.