2009-12-15 29 views
22

Estoy escribiendo una aplicación usando Zend_Framework (por lo que la solución puede basarse en ella).¿Cómo obtener la zona horaria del cliente?

¿Cómo obtener la zona horaria del cliente?

Por ejemplo, si alguien en Moscú, Rusia, quiero obtener 3 * 60 * 60 (porque hay UTC + 3). Si él está en el Reino Unido, quiero cero. Si usa UTC-3: 30 (¿Canadá?), Quiero -3.5 * 60 * 60.

(no es una cuestión de formato, estoy de acuerdo con obtener 'Europa/Moscú' o 'UTC-3' para San Petersburgo, Rusia, se trata más bien de utilizar el cliente de zona horaria. Pero delta en segundos es preferido)

La única solución que me viene a la mente es dejar javascript obtener la hora local para mí y redirigir.

+2

nota, todas las respuestas en esta pregunta son defectuosos, ya que sólo reciben la corriente * * compensado. Consulte "Zona horaria! = Compensación" en [la wiki de la etiqueta de la zona horaria] (http://stackoverflow.com/tags/timezone/info), y vea la pregunta del dup y sus respuestas. –

Respuesta

7

Consulte this article on how to detect the timezone configurando una Cookie a través de JavaScript que contendrá la zona horaria del cliente. Es bastante largo, pero eso es porque es bastante detallado. Implementé una solución en esta línea en una de mis propias aplicaciones y funciona bastante bien.

También puede enviar la zona horaria a través de Ajax al servidor y hacer que haga lo que necesite para hacerlo con eso. O bien, si no está haciendo ningún cálculo en el servidor con él, simplemente aplique el lado del cliente de la zona horaria cuando sea necesario. Realmente depende de tu uso.

Además de eso, sugiero que deje que el visitante configure su zona horaria y la almacene en la cookie o en una sesión.

+8

Ese enlace está roto. Esto podría ser una copia: http://blog.codez.in/php5-time-zone-solution/web-development/2010/07/09 –

+0

@Jose gracias por señalar Y suministrar alternativa – Gordon

+1

ambos enlaces ahora rotos: - ( – rmirabelle

-1

Creo que su mejor opción es adivinar basándose en el encabezado Accept-Language enviado por el cliente.

+0

para recuperar el país y la ciudad que puedo usar geoip. Pero las zonas horarias como 'Europa/Moscú' se pueden establecer solo para ciudades específicas, mientras que el cliente puede ser desde cualquier lugar –

+0

Es cierto, y el Idioma de aceptación probablemente cubrirá una gran área de zonas horarias, pero el cliente realmente no envía nada más de eso indica su zona horaria. Lo más preciso sería su sugerencia de redirigir en función de javascript, pero es demasiado malo tener dos cargas de página por solicitud de página ... – Myles

+0

Puedo almacenarlo en una sesión a continuación :) Es solo una solicitud adicional. Creo que iré de esta manera si no encuentro nada más. –

8

Escribí una función usando jQuery y PHP. ¡Esto se prueba y funciona!

En la página PHP en el que se desea tener la zona horaria como una variable, tienen 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 permitirá la lectura de la variable de sesión "tiempo", que ahora estamos a punto de crear

En la misma página, en el, es necesario en primer lugar incluir jQuery:

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

También en el, por debajo del jQuery, pega este:

<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 o no lo has notado, pero debes cambiar la URL a tu dominio real.

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

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

Si esto funciona correctamente, primero se carga la página, ejecutar el código JavaScript y recarga 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.

+0

¿Combina javascript y php-code? ¿Lo está realmente? – drull

+4

¿Por qué? A menos que me equivoque, la zona horaria solo puede declararse desde el lado del cliente, y tenerla en el php session agrega mucha flexibilidad – americanknight

+0

Sí, ofc, necesitas javascript para hacer esto. Pero estoy hablando de incrustar php puro en html: es código de mono. Mejor uso de temperatura lates. Sería despedido al día siguiente si hago algo como esto :) – drull

2

Esta es una solución galleta con muy poca sobrecarga:

echo <<<EOE 
    <script type="text/javascript"> 
    if (navigator.cookieEnabled) 
     document.cookie = "tzo="+ (- new Date().getTimezoneOffset()); 
    </script> 
EOE; 
    if (!isset($_COOKIE['tzo'])) { 
    echo <<<EOE 
     <script type="text/javascript"> 
     if (navigator.cookieEnabled) document.reload(); 
     else alert("Cookies must be enabled!"); 
     </script> 
EOE; 
    die(); 
    } 
    $ts = new DateTime('now', new DateTimeZone('GMT')); 
    $ts->add(DateInterval::createFromDateString($_COOKIE['tzo'].' minutes')); 
+0

'new DateTime ('now', new DateTimeZone ('GMT')); 'probablemente debería estar usando' UTC' en lugar de 'GMT' por MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset –

Cuestiones relacionadas