Pregunta Determinar la zona horaria de un usuario


¿Hay alguna forma estándar para que un servidor web pueda determinar la zona horaria de un usuario dentro de una página web?

¿Tal vez desde un encabezado HTTP o parte de la cadena de agente de usuario?


536
2017-08-01 00:42


origen


Respuestas:


-new Date().getTimezoneOffset()/60;

El método getTimezoneOffset() restará tu tiempo de GMT y devolverá la cantidad de minutos. Entonces, si vives en GMT-8, devolverá 480.

Para poner esto en horas, divida por 60. Además, observe que el signo es lo contrario de lo que necesita: calcula el desplazamiento de GMT desde su zona horaria, no el desplazamiento de la zona horaria desde GMT. Para solucionar esto, 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 usar   Horario de verano.


305
2017-11-27 17:52



La forma más popular (= ¿estándar?) De determinar la zona horaria que he visto es simplemente preguntando a los usuarios. Si su sitio web requiere suscripción, esto podría guardarse en los datos del perfil de los usuarios. Para los usuarios de anon, las fechas se pueden mostrar como UTC o GMT o algo así.

No estoy tratando de ser inteligente. Es solo que a veces algunos problemas tienen soluciones más finas fuera de cualquier contexto de programación.


178
2017-08-03 19:30



No hay encabezados HTTP que informen la zona horaria de los clientes hasta el momento, aunque se ha sugerido su inclusión en la especificación HTTP.

Si fuera yo, probablemente trataría de buscar la zona horaria usando el JavaScript del lado del cliente y luego enviarlo al servidor usando Ajax o algo así.


82
2017-08-01 12:19



Javascript es la forma más fácil de obtener la hora local del cliente. Sugeriría usar una XMLHttpRequest para devolver la hora local, y si eso falla, vuelva 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 que paga y proporciona actualizaciones mensuales para su base de datos. Proporcionan envoltorios en varios idiomas web.


48
2017-08-01 15:11



Aquí hay una solución robusta de JavaScript para determinar la zona horaria en la que se encuentra el navegador.

>>> var timezone = jstz.determine();
>>> timezone.name(); 
"Europe/London"

https://bitbucket.org/pellepim/jstimezonedetect


43
2017-08-06 21:22



Aquí hay una forma más completa.

  1. Obtenga la compensación de zona horaria para el usuario
  2. Pruebe algunos días en los límites de DLS para determinar si se encuentran en una zona que usa DLS.

Excepto abajo:

function TimezoneDetect(){
    var dtDate = new Date('1/1/' + (new Date()).getUTCFullYear());
    var intOffset = 10000; //set initial offset high so it is adjusted on the first attempt
    var intMonth;
    var intHoursUtc;
    var intHours;
    var intDaysMultiplyBy;

    //go through each month to find the lowest offset to account for DST
    for (intMonth=0;intMonth < 12;intMonth++){
        //go to the next month
        dtDate.setUTCMonth(dtDate.getUTCMonth() + 1);

        //To ignore daylight saving time look for the lowest offset.
        //Since, during DST, the clock moves forward, it'll be a bigger number.
        if (intOffset > (dtDate.getTimezoneOffset() * (-1))){
            intOffset = (dtDate.getTimezoneOffset() * (-1));
        }
    }

    return intOffset;
}

Obtener TZ y DST desde JS (a través de Way Back Machine)


36
2018-03-30 20:48



Usando el enfoque de Unkwntech, escribí una función usando jQuery y PHP. ¡Esto se prueba y funciona!

En la página de PHP donde desea tener la zona horaria como una variable, tenga este fragmento de código en algún lugar cerca de la parte superior de la página:

<?php    
    session_start();
    $timezone = $_SESSION['time'];
?>

Esto leerá la variable de sesión "tiempo", que ahora vamos a crear.

En la misma página, en el, primero debe incluir jQuery:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

También en el, debajo de jQuery, pega esto:

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://domain.com/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

Puede haberlo notado o no, pero debe cambiar la URL a su dominio real.

Una última cosa. Probablemente se esté preguntando qué diablos es timezone.php. Bueno, es simplemente esto: (crea un nuevo archivo llamado timezone.php y apúntalo con la URL anterior)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

Si esto funciona correctamente, primero cargará la página, ejecutará JavaScript y volverá a cargar la página. ¡Entonces podrá leer la variable $ zonezone y usarla para su gusto! Devuelve el desplazamiento de zona horaria UTC / GMT actual (GMT -7) o la zona horaria en la que se encuentre.


27
2018-04-09 19:16