Skip to main content
Blog
Blog

Cómo obtener la zona horaria del navegador en JavaScript (guía 2026)

Obtén la zona horaria del navegador en JavaScript con una línea de código Intl, lee el desfase UTC, gestiona el horario de verano y úsala como señal de fraude.

Jul 27, 2026 5 min read
Cómo obtener la zona horaria del navegador en JavaScript (guía 2026)

Si necesitas la zona horaria del visitante en el navegador, JavaScript te la da en una línea. Esta guía cubre la fórmula moderna de una línea, el enfoque antiguo con getTimezoneOffset y cuándo usar cada uno, cómo obtener la hora UTC, cómo formatear una fecha en cualquier zona horaria, los casos límite que despistan a la gente y por qué la zona horaria del navegador también es una señal útil de fraude y de device fingerprinting.

Resumen: obtener la zona horaria del navegador en JavaScript

  • La forma moderna: Intl.DateTimeFormat().resolvedOptions().timeZone devuelve el nombre IANA (por ejemplo America/New_York). Funciona en todos los navegadores actuales y no necesita ninguna librería.
  • new Date().getTimezoneOffset() devuelve el desfase respecto a UTC en minutos, pero con el signo invertido y cambia con el horario de verano, así que prefiere el nombre IANA para almacenar.
  • La zona horaria reportada se puede falsificar, por lo que los sistemas de detección de fraude y de bots la tratan como una señal más entre muchas, comparada con la geolocalización por IP y el fingerprint TLS.

Cómo obtener la zona horaria del navegador en JavaScript (la línea única)

La forma moderna y fiable de leer la zona horaria del navegador es la API Intl:

const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
// "America/New_York", "Europe/London", "Asia/Tokyo", ...

Intl.DateTimeFormat().resolvedOptions() devuelve la configuración regional y de formato que el navegador resolvió para el entorno actual, y su propiedad timeZone es el nombre de zona horaria IANA. Este es el valor que casi siempre quieres: es estable, legible por humanos e independiente del desfase actual del horario de verano. Está soportado en todos los navegadores modernos (Chrome, Firefox, Safari, Edge).

Cómo obtener el desfase UTC con getTimezoneOffset()

Antes de que Intl tuviera soporte generalizado, el enfoque común era Date.prototype.getTimezoneOffset():

const offsetMinutes = new Date().getTimezoneOffset();
// New York in summer (EDT, UTC-4): 240
// London in winter (GMT, UTC+0): 0

Aquí hay dos cosas que sorprenden a la gente. Primero, el signo está invertido: una zona que está por detrás de UTC devuelve un número positivo. getTimezoneOffset devuelve los minutos que sumas a la hora local para llegar a UTC, así que UTC-4 es 240, no -240. Segundo, el desfase no es la zona horaria. Cambia dos veces al año con el horario de verano, y varias zonas distintas comparten el mismo desfase, por lo que no puedes recuperar el nombre IANA a partir de él. Usa el desfase para cálculos rápidos de UTC; usa el nombre IANA para identificar o almacenar la zona.

Con lo básico cubierto, las dos secciones siguientes tratan la hora UTC y el formateo en una zona concreta, y luego llegamos a por qué este valor importa para la detección de fraude.

Cómo obtener la hora UTC actual en JavaScript

UTC es independiente de la zona horaria del visitante, por eso es el formato correcto para enviar a un servidor o almacenar en una base de datos:

const now = new Date();
now.toISOString();   // "2026-07-27T14:03:00.000Z" (always UTC)
now.getTime();       // epoch milliseconds, UTC-based
Date.now();          // epoch milliseconds, shorthand

toISOString() siempre devuelve UTC (la Z final), independientemente de dónde esté el usuario. Almacena las marcas de tiempo en UTC y conviértelas a la zona del usuario solo para mostrarlas.

Formatear una fecha en una zona horaria concreta

Para mostrar una fecha en una zona elegida, pasa timeZone a Intl.DateTimeFormat:

new Intl.DateTimeFormat("en-US", {
  timeZone: "America/New_York",
  dateStyle: "medium",
  timeStyle: "short",
}).format(new Date());
// "Jul 27, 2026, 10:03 AM"

Esto convierte y formatea en un solo paso y gestiona el horario de verano automáticamente para la zona indicada. No hace falta ninguna librería de fechas para este caso tan común.

Casos límite: horario de verano, navegadores antiguos y zonas horarias falsificadas

Algunas cosas a tener en cuenta antes de confiar en el valor:

  • Horario de verano. El desfase cambia a lo largo del año. Almacena siempre el nombre IANA, no un desfase fijo, y deja que la plataforma resuelva el desfase para una fecha dada.
  • Entornos muy antiguos. En navegadores heredados donde Intl no está disponible, resolvedOptions().timeZone puede ser undefined. Recurre a getTimezoneOffset() para un desfase aproximado, o detecta la característica y degrada con elegancia.
  • El valor se puede cambiar. La zona horaria que reporta JavaScript proviene del sistema operativo y del navegador, y un usuario puede cambiarla. Los navegadores antidetección y los frameworks de automatización pueden sobrescribirla por completo.

Ese último punto es donde esto pasa de ser un detalle de formato a una señal de seguridad.

Por qué la zona horaria del navegador es una señal de fraude y fingerprinting

La zona horaria es una de las señales que entran en el device fingerprinting. Por sí sola es de baja entropía, pero se vuelve poderosa en combinación con, y en contradicción con, otras señales:

  • Zona horaria frente a geolocalización por IP. Si la IP de la conexión se geolocaliza en un país pero el navegador reporta una zona horaria del otro lado del mundo, esa discrepancia es un indicio clásico de una VPN, un proxy o un bot ejecutándose en infraestructura alquilada. Esta es una entrada básica para la detección de viaje imposible y la detección de VPN.
  • Zona horaria frente a idioma y TLS. Un perfil humano coherente tiene un conjunto de señales consistente. Una zona Europe/London reportada junto con una configuración regional y un fingerprint TLS que no encajan es el tipo de contradicción que produce el fraude automatizado.
  • Un valor falsificado es en sí mismo una señal. Cuando la zona horaria reportada a JavaScript no concuerda con otras mediciones de tiempo, esa inconsistencia delata un navegador antidetección en lugar de un usuario real.

Por eso una credencial robada usada desde la máquina de un atacante, o un agente de IA controlando un navegador headless, a menudo se delata en la zona horaria: el valor o contradice la red o es demasiado limpio para ser real. cside lee la zona horaria del navegador junto a más de 100 señales adicionales para detectar exactamente estas discrepancias, alimentando en tiempo real las decisiones de robo de cuentas y de detección de bots.

Lecturas adicionales

Mike Kutlu
Client-Side Security Consultant

Client-side security consultant at cside. 10+ years of experience implementing technology solutions for enterprises (previously at Oracle, Cloudflare, and Splunk). Now helping teams use client-side intelligence to catch & reduce fraud.

FAQ

Frequently Asked Questions

Llama a Intl.DateTimeFormat().resolvedOptions().timeZone. Devuelve el nombre de zona horaria IANA del navegador, como America/New_York o Europe/London, en todos los navegadores modernos. No se necesita ninguna librería.

new Date().getTimezoneOffset() devuelve la diferencia respecto a UTC en minutos, pero con el signo invertido: una zona que es UTC-5 devuelve 300, no -300. Además solo indica el desfase actual, que cambia con el horario de verano, no en qué zona está el usuario. Intl.DateTimeFormat().resolvedOptions().timeZone devuelve el nombre IANA estable, que es lo que quieres almacenar o usar como señal.

Se puede leer de forma fiable, pero también se puede falsificar. Un usuario puede cambiar la zona horaria de su sistema operativo, y los navegadores antidetección y las herramientas de automatización pueden sobrescribir el valor que se devuelve a JavaScript. Por eso los sistemas de fraude comparan la zona horaria reportada con otras señales, como la geolocalización por IP y el fingerprint TLS, en lugar de confiar solo en ella.

Monitoriza y protege tus scripts de terceros

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Empieza gratis o prueba Business con una versión de prueba de 14 días.

Interfaz del panel de cside que muestra la monitorización de scripts y el análisis de seguridad
Related Articles
Reservar una demo