¿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?
¿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?
-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.
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.
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í.
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.
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"
Aquí hay una forma más completa.
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)
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.