2009-12-15 25 views
22

Sto scrivendo un'applicazione utilizzando Zend_Framework (quindi la soluzione può fare affidamento su di essa).Come ottenere il fuso orario del cliente?

Come ottenere il fuso orario del cliente?

Ad esempio, se qualcuno a Mosca, in Russia, desidera ottenere 3 * 60 * 60 (perché c'è UTC + 3). Se lui è nel Regno Unito, voglio zero. Se usa UTC-3: 30 (Canada?), Voglio -3.5 * 60 * 60.

(non si tratta di un formato - Sto bene con l'acquisto di "Europa/Mosca" o "UTC-3" per San Pietroburgo, Russia, piuttosto di utilizzare il client del fuso orario. preferito)

L'unica soluzione che viene in mente è lasciare che javascript ottenga l'ora locale per me e il reindirizzamento.

+2

nota, tutte le risposte a questa domanda sono viziata perché solo ottenere la corrente * * compensato. Vedi "Fuso orario! = Offset" in [wiki tag timezone] (http://stackoverflow.com/tags/timezone/info), e vedi la domanda dup e le sue risposte. –

risposta

7

Check out this article on how to detect the timezone impostando un cookie tramite JavaScript che manterrà il fuso orario del client. È piuttosto prolungato, ma è perché è piuttosto dettagliato. Ho implementato una soluzione in questo senso in una delle mie app e funziona abbastanza bene.

Si potrebbe anche inviare il fuso orario tramite Ajax al server e fare in modo che si faccia tutto il necessario per farlo in quel momento. Oppure, se non stai facendo calcoli su serveride con esso, basta applicare il lato client timezone dove necessario. Dipende davvero dal tuo caso.

In aggiunta a ciò, suggerisco di lasciare che il visitatore imposti il ​​proprio fuso orario e memorizzarlo nel Cookie o in una sessione.

+8

Questo link è rotto. Questa potrebbe essere una copia: http://blog.codez.in/php5-time-zone-solution/web-development/2010/07/09 –

+0

@Jose ringraziamenti per aver segnalato E fornendo un'alternativa – Gordon

+1

entrambi i collegamenti ora interrotti: - ( – rmirabelle

-1

Penso che la cosa migliore da fare sia indovinare in base all'intestazione Accept-Language inviata dal cliente.

+0

per recuperare il paese e la città Posso usare geoip. Ma i fusi orari come "Europa/Mosca" possono essere impostati solo per città specifiche, mentre il client può essere ovunque –

+0

È vero, e il linguaggio Accept probabilmente coprirà una vasta area di fusi orari, ma il client non invia realmente nulla altro oltre che indica il loro fuso orario. Il più preciso sarebbe il tuo suggerimento di reindirizzamento basato su javascript, ma è troppo brutto avere due carichi di pagina per richiesta di pagina ... – Myles

+0

Posso memorizzarlo in una sessione quindi :) È solo una richiesta aggiuntiva. Penso che andrò da questa parte se non trovo qualcos'altro. –

8

Ho scritto una funzione utilizzando jQuery e PHP. Questo è testato, e funziona!

Nella pagina PHP in cui si desidera avere il fuso orario come una variabile, hanno questo frammento di codice da qualche parte vicino alla parte superiore della pagina:

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

Questo leggerà la variabile di sessione "tempo", che stiamo ora creando.

Nella stessa pagina, nella, è necessario prima di tutto comprendere jQuery:

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

Anche nel, sotto il jQuery, incollare questo:

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

si può o non l'ho notato, ma è necessario modificare l'URL nel tuo dominio attuale.

Un'ultima cosa. Probabilmente ti starai chiedendo cosa diavolo è il timezone.php. Beh, è ​​semplicemente questo: (creare un nuovo file chiamato timezone.php e scegliere con l'url sopra)

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

Se questo funziona correttamente, in primo luogo caricare la pagina, eseguire il codice JavaScript e ricarica la pagina. Sarai quindi in grado di leggere la variabile $ timezone e usarla a tuo piacimento! Restituisce l'attuale fuso orario UTC/GMT (GMT -7) o qualsiasi fuso orario in cui ti trovi.

+0

Miscelando javascript e php-code? Sei seriamente? – drull

+4

Perché no? A meno che non mi sbagli, il fuso orario può essere dichiarato solo dal lato client, e averlo nel la sessione php aggiunge molta flessibilità – americanknight

+0

Sì, ofc, devi fare javascript per farlo, ma sto parlando di incorporare puro php in html: è una codifica per le scimmie. tardive. Sarei licenziato il giorno successivo se faccio qualcosa del genere :) – drull

2

Questa è una soluzione cookie con overhead molto poco:

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 ')) 'probabilmente dovrebbe usare' UTC' invece di 'GMT' per MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset –

Problemi correlati