¿Hay alguna forma confiable de obtener una zona horaria desde el navegador del cliente? Vi los siguientes enlaces pero quiero una solución más robusta.
javascript
http
browser
timezone
Confucio
fuente
fuente
Respuestas:
Mire este repositorio pageloom es útil
descargue jstz.min.js y agregue una función a su página html
y llame a esta función desde su etiqueta de pantalla
fuente
Intl.DateTimeFormat().resolvedOptions().timeZone
(no IE11) como lo sugiere Wallace.¡Media década después tenemos una forma integrada de hacerlo! Para los navegadores modernos usaría:
Esto devuelve una cadena de zona horaria de IANA, pero no el desplazamiento . Obtenga más información en la referencia de MDN .
Tabla de compatibilidad : a partir de marzo de 2019, funciona para el 90% de los navegadores en uso a nivel mundial. No funciona en Internet Explorer .
fuente
Intl.DateTimeFormat().resolvedOptions().timeZone
->undefined
Intl.DateTimeFormat().resolvedOptions().timeZone
devolverá el valor esperado a partir de Firefox 52: kangax.github.io/compat-table/esintl/…A menudo, cuando las personas buscan "zonas horarias", lo que bastará es simplemente "compensación UTC". por ejemplo, su servidor está en UTC + 5 y quieren saber que su cliente se está ejecutando en UTC-8 .
En javascript antiguo
(new Date()).getTimezoneOffset()/60
, devolverá el número actual de horas compensadas desde UTC.Vale la pena señalar un posible "problema" en el signo del
getTimezoneOffset()
valor de retorno (de los documentos MDN) :Sin embargo, le recomiendo que use day.js para el código Javascript relacionado con la hora / fecha. En ese caso, puede obtener un desplazamiento UTC formateado con ISO 8601 ejecutando:
Probablemente vale la pena mencionar que el cliente puede falsificar fácilmente esta información.
(Nota: esta respuesta originalmente recomendaba https://momentjs.com/ , pero dayjs es una alternativa más moderna y más pequeña).
fuente
Por ahora, la mejor apuesta es probablemente jstz como se sugiere en la respuesta de mbayloon .
Para completar, debe mencionarse que hay un estándar en camino: Intl . Ya puedes ver esto en Chrome:
(Esto en realidad no sigue el estándar, que es una razón más para seguir con la biblioteca)
fuente
Intl
devuelvenundefined
para latimeZone
propiedad si no especificó manualmente una zona horaria en la construcción deDateTimeFormat
. Chrome se desvía del estándar al devolver la zona horaria del sistema; eso es lo que explota la respuesta de Johannes, pero también por qué dijo "en realidad no sigue el estándar".podrías usar moment-timezone para adivinar la zona horaria:
fuente
Aquí hay un jsfiddle
Proporciona la abreviatura de la zona horaria del usuario actual.
Aquí está el ejemplo de código
fuente
May 22 2015 03:45 PM CDT
solíaconsole.log(moment(now).format('MMM DD YYYY hh:mm A') + ' ' + moment.tz.zone(tz.name()).abbr(now.getTime()));
Utilicé un enfoque similar al adoptado por Josh Fraser , que determina el desplazamiento de tiempo del navegador desde UTC y si reconoce DST o no (pero algo simplificado de su código):
Al cargar,
ClientTZ.getBrowserTZ()
se ejecuta la función, que establece:ClientTZ.UTCoffset
al tiempo de desplazamiento 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).Se
ClientTZ.UTCoffset
proporciona en minutos en lugar de horas, porque algunas zonas horarias tienen desplazamientos fraccionales por hora (por ejemplo, +0415).La intención detrás
ClientTZ.UTCoffsetT
es usarlo como una clave en una tabla de zonas horarias (no se proporciona aquí), como para una<select>
lista desplegable .fuente
7-1
para julio en lugar de junio. No estoy seguro de si realmente hace alguna diferencia, ya que dudo que haya esquemas regionales de horario de verano que no incluyan junio.No. No hay una única forma confiable y nunca la habrá. ¿Realmente pensaste que podías confiar en el cliente?
fuente