now moment gettimezoneoffset ejemplos change javascript http browser timezone

javascript - moment - obtener la zona horaria del cliente desde el navegador



set timezone javascript (8)

¡Media década después tenemos una forma integrada para eso! Para navegadores modernos usaría:

Intl.DateTimeFormat().resolvedOptions().timeZone

Es posible que no funcione para el navegador que necesita para admitir , si ese es el caso me gustaría recurrir a una de las bibliotecas presentadas en las respuestas anteriores.

No funciona en Firefox (51 y abajo) e IE https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions#Browser_compatibility

¿Hay una manera confiable de obtener una zona horaria desde el navegador del cliente? Vi los siguientes enlaces, pero quiero una solución más sólida.

Detecta automáticamente una zona horaria con JavaScript

Detección de zona horaria en JavaScript


A menudo, cuando las personas buscan "zonas horarias", lo que será suficiente es solo "compensación UTC". por ejemplo, su servidor está en UTC + 5 y quieren saber que su cliente se está ejecutando en UTC-8 .

En un simple javascript antiguo (new Date()).getTimezoneOffset()/60 devolverá el número actual de horas de compensación de UTC.

Vale la pena señalar un posible "error" en el signo del valor de retorno getTimezoneOffset() (de documentos MDN) :

El desplazamiento de la zona horaria es la diferencia, en minutos, entre el UTC y la hora local. Tenga en cuenta que esto significa que la compensación es positiva si la zona horaria local está detrás de UTC y negativa si está adelante. Por ejemplo, para la zona horaria UTC + 10: 00 (hora estándar del este de Australia, hora de Vladivostok, hora estándar de Chamorro), se devolverá -600.

Sin embargo, te recomiendo que uses el moment.js para el código Javascript relacionado con el tiempo / la fecha. En ese caso, puede obtener un desplazamiento UTC formateado ISO 8601 ejecutando:

> moment().format("Z") "-08:00"

(Probablemente sea necesario mencionar que el cliente puede falsificar fácilmente esta información).


Aquí hay un jsfiddle

Proporciona la abreviatura de la zona horaria del usuario actual.

Aquí está el ejemplo del código

var tz = jstz.determine(); console.log(tz.name()); console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));


Mire esta página de repositorio es útil

descargue jstz.min.js y agregue una función a su página html

<script language="javascript"> function getTimezoneName() { timezone = jstz.determine() return timezone.name(); } </script>

y llame a esta función desde su etiqueta de visualización


No. No hay una sola manera confiable y nunca la habrá. ¿De verdad crees que puedes confiar en el cliente?


Por ahora, la mejor apuesta probablemente sea jstz como se sugiere en la respuesta de mbayloon .

Para completar, se debe mencionar que hay un estándar en su camino: Intl . Ya puedes ver esto en Chrome:

> Intl.DateTimeFormat().resolved.timeZone "America/Los_Angeles"

(Esto en realidad no sigue el estándar, que es una razón más para seguir con la biblioteca)


Utilicé un enfoque similar al adoptado por Josh Fraser , que determina el desplazamiento del tiempo del navegador desde UTC y si reconoce el horario de verano o no (pero algo simplificado desde su código):

var ClientTZ = { UTCoffset: 0, // Browser time offset from UTC in minutes UTCoffsetT: ''+0000S'', // Browser time offset from UTC in ''±hhmmD'' form hasDST: false, // Browser time observes DST // Determine browser''s timezone and DST getBrowserTZ: function () { var self = ClientTZ; // Determine UTC time offset var now = new Date(); var date1 = new Date(now.getFullYear(), 1-1, 1, 0, 0, 0, 0); // Jan var diff1 = -date1.getTimezoneOffset(); self.UTCoffset = diff1; // Determine DST use var date2 = new Date(now.getFullYear(), 6-1, 1, 0, 0, 0, 0); // Jun var diff2 = -date2.getTimezoneOffset(); if (diff1 != diff2) { self.hasDST = true; if (diff1 - diff2 >= 0) self.UTCoffset = diff2; // East of GMT } // Convert UTC offset to ±hhmmD form diff2 = (diff1 < 0 ? -diff1 : diff1) / 60; var hr = Math.floor(diff2); var min = diff2 - hr; diff2 = hr * 100 + min * 60; self.UTCoffsetT = (diff1 < 0 ? ''-'' : ''+'') + (hr < 10 ? ''0'' : '''') + diff2.toString() + (self.hasDST ? ''D'' : ''S''); return self.UTCoffset; } }; // Onload ClientTZ.getBrowserTZ();

Al cargar, se ejecuta la función ClientTZ.getBrowserTZ() , que establece:

  • ClientTZ.UTCoffset al desplazamiento de hora del navegador desde UTC en minutos (por ejemplo, CST es -360 minutos, que es -6.0 horas desde UTC);
  • ClientTZ.UTCoffsetT al desplazamiento en la forma ''±hhmmD'' (por ejemplo, ''-0600D'' ), donde el sufijo es D para DST y S para estándar (no DST);
  • ClientTZ.hasDST (a verdadero o falso).

ClientTZ.UTCoffset se proporciona en minutos en lugar de horas, porque algunas zonas horarias tienen compensaciones horarias fraccionarias (por ejemplo, +0415).

La intención detrás de ClientTZ.UTCoffsetT es usarlo como clave en una tabla de zonas horarias (no proporcionada aquí), como para una lista desplegable <select> .


puede usar moment-timezone para adivinar la zona horaria:

> moment.tz.guess() "America/Asuncion"