Determinar la zona horaria de un usuario

Resuelto Kevin Dente asked hace 16 años • 0 respuestas

¿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-agentcadena?

Kevin Dente avatar Aug 01 '08 07:08 Kevin Dente
Aceptado
-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.

JD Isaacks avatar Nov 27 '2009 17:11 JD Isaacks

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.

Ishmaeel avatar Aug 03 '2008 19:08 Ishmaeel

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í.

Mads Kristiansen avatar Aug 01 '2008 12:08 Mads Kristiansen

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 getTimezoneOffsetuna instancia del Dateobjeto, 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);
Expandir fragmento

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 DateTimeFormatsecció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 IntlAPI si está disponible, y cuando no está disponible, interrogan la getTimezoneOffsetfunción del Dateobjeto, 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.

Matt Johnson-Pint avatar Mar 25 '2014 03:03 Matt Johnson-Pint

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.

pix0r avatar Aug 01 '2008 15:08 pix0r