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.
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 esD
para DST yS
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"