Determinar la zona horaria de un usuario
¿Existe una forma estándar para que un servidor web pueda determinar la zona horaria de un usuario dentro de una página web?
¿Quizás desde un encabezado HTTP o parte de la user-agent
cadena?
-new Date().getTimezoneOffset()/60;
El método getTimezoneOffset()
restará su hora de GMT y devolverá la cantidad de minutos. Entonces, si vives en GMT-8, devolverá 480.
Para poner esto en horas, divida entre 60. Además, observe que el signo es lo opuesto a lo que necesita: está calculando la diferencia de GMT con respecto a su zona horaria, no la diferencia de su zona horaria con respecto a GMT. Para solucionar este problema, simplemente multiplique por -1.
También tenga en cuenta que w3school dice:
El valor devuelto no es una constante debido a la práctica de utilizar el horario de verano.
La forma más popular (==¿estándar?) de determinar la zona horaria que he visto es simplemente preguntar a los propios usuarios. Si su sitio web requiere suscripción, esto podría guardarse en los datos del perfil de los usuarios. Para usuarios anónimos, las fechas podrían mostrarse como UTC o GMT o algo así.
No estoy tratando de ser un sabelotodo. Es sólo que a veces algunos problemas tienen mejores soluciones fuera de cualquier contexto de programación.
Hasta el momento no hay encabezados HTTP que informen la zona horaria del cliente, aunque se ha sugerido incluirlo en la especificación HTTP.
Si fuera yo, probablemente intentaría buscar la zona horaria usando JavaScript del lado del cliente y luego enviarla al servidor usando Ajax o algo así.
Primero, comprenda que la detección de zona horaria en JavaScript es imperfecta. Puede obtener el desplazamiento de la zona horaria local para una fecha y hora determinadas utilizando getTimezoneOffset
una instancia del Date
objeto, pero eso no es lo mismo que una zona horaria completa de la IANA como America/Los_Angeles
.
Sin embargo, hay algunas opciones que pueden funcionar:
- La mayoría de los navegadores modernos admiten zonas horarias de IANA en su implementación de la API de internacionalización de ECMAScript , por lo que puede hacer esto:
const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tzid);
El resultado es una cadena que contiene la configuración de zona horaria de la IANA de la computadora donde se ejecuta el código.
Los entornos admitidos se enumeran en la tabla de compatibilidad internacional . Expanda la DateTimeFormat
sección y observe la función denominada resolvedOptions().timeZone defaults to the host environment
. También aparecen en la tabla de compatibilidad del navegador MDNIntl.DateTimeFormat.prototype.resolvedOptions
en la fila denominada "calculada timeZone
" .
Algunas bibliotecas, como Luxon , utilizan esta API para determinar la zona horaria mediante funciones como
luxon.Settings.defaultZoneName
.Si necesita admitir un conjunto más amplio de entornos, como navegadores web más antiguos, puede utilizar una biblioteca para hacer una suposición fundamentada sobre la zona horaria. Trabajan probando primero la
Intl
API si está disponible, y cuando no está disponible, interrogan lagetTimezoneOffset
función delDate
objeto, para varios momentos diferentes en el tiempo, utilizando los resultados para elegir una zona horaria adecuada de un conjunto de datos internos.Tanto jsTimezoneDetect como moment-timezone tienen esta funcionalidad.
// using jsTimeZoneDetect var tzid = jstz.determine().name(); // using moment-timezone var tzid = moment.tz.guess();
En ambos casos, el resultado sólo puede considerarse una suposición. La suposición puede ser correcta en muchos casos, pero no en todos.
Además, estas bibliotecas deben actualizarse periódicamente para contrarrestar el hecho de que muchas implementaciones antiguas de JavaScript solo conocen la regla actual del horario de verano para su zona horaria local. Más detalles sobre eso aquí.
En última instancia, un mejor enfoque es preguntarle al usuario su zona horaria. Proporcione una configuración que puedan cambiar. Puede utilizar una de las opciones anteriores para elegir una configuración predeterminada , pero no haga imposible desviarse de ella en su aplicación.
También existe el enfoque completamente diferente de no depender en absoluto de la configuración de zona horaria de la computadora del usuario. En cambio, si puede recopilar coordenadas de latitud y longitud, puede resolverlas en una zona horaria utilizando uno de estos métodos . Esto funciona bien en dispositivos móviles.
JavaScript es la forma más sencilla de obtener la hora local del cliente. Sugeriría usar XMLHttpRequest para enviar la hora local y, si eso falla, recurrir a la zona horaria detectada según su dirección IP.
En cuanto a la geolocalización, he usado MaxMind GeoIP en varios proyectos y funciona bien, aunque no estoy seguro de si proporcionan datos de zona horaria. Es un servicio por el que paga y proporciona actualizaciones mensuales a su base de datos. Proporcionan contenedores en varios idiomas web.