¿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?
html
browser
timezone
user-agent
timezone-offset
Kevin Dente
fuente
fuente
Respuestas:
El método
getTimezoneOffset()
restará su tiempo de GMT y devolverá la cantidad de minutos. Entonces, si vives en GMT-8, te devolverá 480.Para poner esto en horas, divida por 60. Además, observe que el letrero es lo opuesto a lo que necesita: está calculando el desplazamiento de GMT desde su zona horaria, no el desplazamiento de su zona horaria desde GMT. Para solucionar esto, simplemente multiplique por -1.
También tenga en cuenta que w3school dice:
fuente
>>> date.toTimeString() "15:46:04 GMT+1200 (New Zealand Standard Time)"
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 los usuarios anon, las fechas se pueden mostrar como UTC o GMT o algo así.
No estoy tratando de ser un sabelotodo. Es solo que a veces algunos problemas tienen soluciones más finas fuera de cualquier contexto de programación.
fuente
No hay encabezados HTTP que informarán la zona horaria de los clientes hasta ahora, aunque se ha sugerido incluirla 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í.
fuente
JavaScript es la forma más fácil 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 en función de 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 proporcionan actualizaciones mensuales a su base de datos. Proporcionan envoltorios en varios idiomas web.
fuente
Primero, comprenda que la detección de zona horaria en JavaScript es imperfecta. Usted puede obtener el local de desplazamiento de zona horaria para una fecha y hora determinada utilizando
getTimezoneOffset
en una instancia delDate
objeto, pero eso no es exactamente lo mismo que una completa zona horaria IANA comoAmerica/Los_Angeles
.Sin embargo, hay algunas opciones que pueden funcionar:
El resultado es una cadena que contiene la configuración de zona horaria IANA de la computadora donde se ejecuta el código.
Los entornos compatibles se enumeran en la tabla de compatibilidad internacional . Expande la
DateTimeFormat
sección y mira la característica nombradaresolvedOptions().timeZone defaults to the host environment
.Algunas bibliotecas, como Luxon, usan esta API para determinar la zona horaria a través de funciones como
luxon.Settings.defaultZoneName
.Intl
API si está disponible, y cuando no está disponible, interrogan lagetTimezoneOffset
función delDate
objeto, durante varios puntos diferentes en el tiempo, utilizando los resultados para elegir una zona horaria adecuada de un conjunto de datos interno.Tanto jsTimezoneDetect como moment-timezone tienen esta funcionalidad.
En ambos casos, el resultado solo 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 de JavaScript antiguas solo conocen la regla de horario de verano actual para su zona horaria local. Más detalles sobre eso aquí.
En última instancia, un mejor enfoque es pedirle a su usuario su zona horaria. Proporcione una configuración que puedan cambiar. Puedes usar una de las opciones anteriores para elegir una configuración predeterminada , pero no hagas imposible desviarte de eso en tu 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 reunir las coordenadas de latitud y longitud, puede resolverlas en una zona horaria utilizando uno de estos métodos . Esto funciona bien en dispositivos móviles.
fuente
Aquí hay una solución robusta de JavaScript para determinar la zona horaria en la que se encuentra el navegador.
https://bitbucket.org/pellepim/jstimezonedetect
Apéndice 1: ahora este proyecto se encuentra en GitHub: https://github.com/pellepim/jstimezonedetect
fuente
Aquí hay una manera más completa.
Un extracto está a continuación:
Obtener TZ y DST de JS (a través de Way Back Machine)
fuente
Africa/Johannesburg
oEurope/Istanbul
. Vea el wiki de etiqueta de zona horaria .Usando el enfoque de Unkwntech, escribí una función usando jQuery y PHP. ¡Esto está probado y funciona!
En la página PHP donde desea tener la zona horaria como variable, tenga este fragmento de código en algún lugar cerca de la parte superior de la página:
Esto leerá la variable de sesión "tiempo", que ahora estamos a punto de crear.
En la misma página, en <head>, primero debe incluir jQuery:
También en <head>, debajo de jQuery, pegue esto:
Puede que hayas notado o no, pero debes cambiar la URL a tu dominio real.
Una última cosa. Probablemente se esté preguntando cuál es el heck timezone.php. Bueno, es simplemente esto: (cree un nuevo archivo llamado timezone.php y apúntelo con la URL anterior)
Si esto funciona correctamente, primero cargará la página, ejecutará JavaScript y volverá a cargar la página. ¡Entonces podrá leer la variable $ timezone y usarla a su gusto! Devuelve el desplazamiento de zona horaria UTC / GMT actual (GMT -7) o cualquier zona horaria en la que se encuentre.
fuente
Para enviar el desplazamiento de zona horaria como un encabezado HTTP en solicitudes AJAX con jQuery
También puede hacer algo similar para obtener el nombre real de zona horaria mediante el uso
moment.tz.guess();
de http://momentjs.com/timezone/docs/#/using-timezones/guessing-user-timezone/fuente
Todavía no he visto una respuesta detallada aquí que obtenga la zona horaria. No debería necesitar geocodificar por dirección IP o usar PHP (lol) o adivinar incorrectamente desde un desplazamiento.
En primer lugar, una zona horaria no es solo un desplazamiento de GMT. Es un área de tierra en la que las normas de tiempo se establecen según los estándares locales. Algunos países tienen horario de verano y activarán el horario de verano en diferentes momentos. Por lo general, es importante obtener la zona real, no solo el desplazamiento actual.
Si tiene la intención de almacenar esta zona horaria, por ejemplo, en las preferencias del usuario, desea la zona y no solo el desplazamiento. Para las conversiones en tiempo real no importará mucho.
Ahora, para obtener la zona horaria con JavaScript, puede usar esto:
Sin embargo, me resultó más fácil usar este complemento robusto que devuelve la zona horaria formateada de Olsen:
https://github.com/scottwater/jquery.detect_timezone
fuente
Con la
date
función PHP obtendrá la fecha y hora del servidor en el que se encuentra el sitio. La única forma de obtener tiempo para el usuario es usar JavaScript.Pero le sugiero que, si su sitio requiere registro, la mejor manera es pedirle al usuario que se registre como un campo obligatorio. Puede enumerar varias zonas horarias en la página de registro y guardarlas en la base de datos. Después de esto, si el usuario inicia sesión en el sitio, puede establecer la zona horaria predeterminada para esa sesión según la zona horaria seleccionada por los usuarios.
Puede establecer cualquier zona horaria específica utilizando la función PHP
date_default_timezone_set
. Esto establece la zona horaria especificada para los usuarios.Básicamente, la zona horaria de los usuarios va al lado del cliente, por lo que debemos usar JavaScript para esto.
A continuación se muestra el script para obtener la zona horaria de los usuarios utilizando PHP y JavaScript.
Pero según mi punto de vista, es mejor preguntar a los usuarios si el registro es obligatorio en su proyecto.
fuente
No use la dirección IP para determinar definitivamente la ubicación (y, por lo tanto, la zona horaria), ya que con NAT, proxies (cada vez más populares) y VPN, las direcciones IP no necesariamente reflejan de manera realista la ubicación real del usuario, sino la ubicación en la que los servidores que implementan esos protocolos residen.
Similar a cómo los códigos de área de EE. UU. Ya no son útiles para localizar a un usuario de teléfono, dada la popularidad de la portabilidad numérica.
La dirección IP y otras técnicas que se muestran arriba son útiles para sugerir un valor predeterminado que el usuario puede ajustar / corregir.
fuente
JavaScript:
Simplemente proporcione sus tiempos en formato de marca de tiempo Unix a esta función; JavaScript ya conoce la zona horaria del usuario.
Me gusta esto:
PHP:
Esto siempre mostrará las horas correctamente en función de la zona horaria que la persona ha configurado en el reloj de su computadora. No hay necesidad de pedirle nada a nadie y guardarlo en lugares, ¡gracias a Dios!
fuente
Fácil, solo use la
getTimezoneOffset
función JavaScript de esta manera:fuente
La magia todo parece estar en
Eso es genial, no sabía sobre eso. ¿Funciona en Internet Explorer, etc.? Desde allí, debería poder usar JavaScript para Ajax, configurar cookies, lo que sea. Probablemente iría yo mismo por la ruta de las galletas.
Sin embargo, deberá permitir que el usuario lo cambie. Intentamos usar la geolocalización (a través de maxmind) para hacer esto hace un tiempo, y fue un error razonablemente frecuente, lo suficiente como para que no valga la pena hacerlo, así que solo dejamos que el usuario lo configure en su perfil y muestre un aviso a los usuarios que No he configurado el suyo todavía.
fuente
Aquí hay un artículo (con código fuente) que explica cómo determinar y usar el tiempo localizado en una aplicación ASP.NET (VB.NET, C #):
Ya es hora
En resumen, el enfoque descrito se basa en la
getTimezoneOffset
función de JavaScript , que devuelve el valor guardado en la cookie de sesión y utilizado por el código subyacente para ajustar los valores de hora entre GMT y la hora local. Lo bueno es que el usuario no necesita especificar la zona horaria (el código lo hace automáticamente). Hay más involucrados (es por eso que hago un enlace al artículo), pero el código proporcionado hace que sea realmente fácil de usar. Sospecho que puede convertir la lógica a PHP y otros lenguajes (siempre que comprenda ASP.NET).fuente
Si utiliza OpenID para la autenticación, la Extensión de registro simple resolvería el problema para los usuarios autenticados (deberá convertir de tz a numérico).
Otra opción sería inferir la zona horaria de la preferencia de país del agente de usuario. Este es un método algo burdo (no funcionará para Estados Unidos), pero es una buena aproximación.
fuente
Es simple con JavaScript y PHP:
A pesar de que el usuario puede meterse con su reloj interno y / o zona horaria, la mejor manera que encontré hasta ahora, para obtener el desplazamiento, sigue siendo
new Date().getTimezoneOffset();
. No es invasivo, no produce dolor de cabeza y elimina la necesidad de depender de terceros.Digamos que tengo una tabla,
users
que contiene un campodate_created int(13)
, para almacenar marcas de tiempo de Unix;Asumiendo un cliente
creates a new account
, los datos son recibidos porpost
, y necesitoinsert/update
ladate_created column
marca de tiempo Unix del cliente, no la del servidor.Dado que el timezoneOffset es necesario en el momento de la inserción / actualización, se pasa como un elemento adicional $ _POST cuando el cliente envía el formulario, eliminando así la necesidad de almacenarlo en sesiones y / o cookies, y tampoco afecta al servidor adicional.
Digamos que el servidor recibe
tzo
como$_POST['tzo']
;Insertar / actualizar
date_created=$user_timestamp
.Al recuperar date_created, puede convertir la marca de tiempo de esta manera:
Ahora, este ejemplo puede ajustarse a las necesidades de uno, cuando se trata de insertar una
first
marca de tiempo ... Cuando se trata de una marca de tiempo o tabla adicional, puede considerar insertar el valor tzo en la tabla de usuarios para referencia futura, o configurarlo como sesión o como cookie.PD PERO qué pasa si el usuario viaja y cambia de zona horaria. Inicia sesión en GMT + 4, viaja rápido a GMT-1 y vuelve a iniciar sesión. El último inicio de sesión sería en el futuro.
Creo ... pensamos demasiado.
fuente
Puede hacerlo en el cliente con zona horaria y enviar el valor al servidor; uso de muestra:
fuente
Obtener un nombre válido de zona horaria de la base de datos TZ en PHP es un proceso de dos pasos:
Con JavaScript, obtenga el desplazamiento de la zona horaria en minutos
getTimezoneOffset
. Este desplazamiento será positivo si la zona horaria local está detrás de UTC y negativo si está adelante. Por lo tanto, debe agregar un signo opuesto al desplazamiento.Pase este desplazamiento a PHP.
En PHP, convierta este desplazamiento en un nombre de zona horaria válido con la función timezone_name_from_abbr .
He escrito una publicación de blog sobre él: Cómo detectar la zona horaria del usuario en PHP . También contiene una demostración.
fuente
Intl.DateTimeFormat().resolvedOptions().timeZone
y enviarlo al servidor web. Ref: stackoverflow.com/questions/9772955/…Una forma sencilla de hacerlo es mediante el uso de:
fuente
Una opción posible es usar el
Date
campo de encabezado, que se define en RFC 7231 y se supone que incluye la zona horaria. Por supuesto, no se garantiza que el valor sea realmente la zona horaria del cliente, pero puede ser un punto de partida conveniente.fuente
Así es como lo hago. Esto establecerá la zona horaria predeterminada de PHP en la zona horaria local del usuario. Simplemente pegue lo siguiente en la parte superior de todas sus páginas:
fuente
Prueba este código PHP:
fuente