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().timeZonedevuelve el nombre IANA (por ejemploAmerica/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
Intlno está disponible,resolvedOptions().timeZonepuede serundefined. Recurre agetTimezoneOffset()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/Londonreportada 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.








