Gestione di server PHP e server MySQL in fusi orari diversi


11

Per quelli di noi che utilizzano pacchetti di hosting condiviso standard, come GoDaddy o Network Solutions, come gestiscono le conversioni datetime quando il server di hosting (PHP) e il server MySQL sono in fusi orari diversi?

Inoltre, qualcuno ha qualche consiglio sulle migliori pratiche per determinare in quale fuso orario si trova un visitatore del tuo sito e manipolare opportunamente una variabile datetime?

17

Dal PHP 5.1.0 è possibile utilizzare date_default_timezone_set() funzione per impostare il fuso orario predefinito utilizzato da tutte le funzioni di data/ora in uno script.

per MySQL (citato da MySQL Server Time Zone Support pagina)

Prima di MySQL 4.1.3, il server funziona solo nel fuso orario del sistema impostato in fase di avvio. A partire da MySQL 4.1.3, il server mantiene diverse impostazioni del fuso orario, alcune delle quali possono essere modificate in fase di runtime.

Di interesse per voi è l'impostazione per-connessione dei fusi orari, che si usa all'inizio del vostro script

SET timezone = 'Europe/London'; 

Per quanto riguarda la rilevazione della impostazione del client fuso orario, si potrebbe usare un po ' di JavaScript per ottenere e salvare tali informazioni su un cookie e utilizzarlo nelle letture successive della pagina per calcolare il fuso orario corretto.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes. 
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset); 

Oppure è possibile offrire agli utenti la possibilità di impostare i propri fusi orari.


11

Archiviare tutto come UTC. Puoi eseguire conversioni a livello di client o sul lato server utilizzando le impostazioni del client.

php - date

mysql - utc-timestamp

  0

+1 ottengo l'aspetto malfidata, ma ho sempre memorizzare unix tempo/epoca come una firma int (vogliono firmato per la data di matematica). Mai qualsiasi confusione e sopravvive governo turni TZ. 07 dic. 092009-12-07 20:55:13

  0

+1, mantenere le cose semplici e normalizzati (= in UTC) a livello di dati rende difficile ottenere la logica sbagliata. Eventuali conversioni specifiche della locale dovrebbe essere fatto solo a livello di visualizzazione. 24 set. 122012-09-24 08:48:17


0

Ho salvato tutte le mie date come bigint a causa di problemi di tipo DateTime. Ho salvato il risultato della funzione PHP time() nello stesso fuso orario :)


3

RE la risposta di Željko Živković, i descrittori del fuso orario come "Europa/Londra" funzionano solo se l'amministratore mySQL ha aggiunto le tabelle del fuso orario al sistema e le mantiene aggiornate.

Altrimenti ci si limita a offset numerici come '-4: 00'. Fortunatamente la data di php ('P') formato lo fornisce (come del 5.1.3)

Quindi, nel dire un file di configurazione app si potrebbe avere

define('TZ', 'US/Pacific'); 
.... 
if (defined('TZ') && function_exists('date_default_timezone_set')) { 
    date_default_timezone_set(TZ); 
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P'))); 
} 

Ciò significa PHP e MySQL sarà d'accordo su che cosa fuso orario offset da utilizzare.

Utilizzare sempre TIMESTAMP per memorizzare i valori di ora. La colonna viene effettivamente memorizzata come UNIX_TIME (epoca) ma convertita implicitamente dall'offset time_zone corrente quando viene scritta, e indietro quando viene letta.

Se si desidera visualizzare gli orari per gli utenti in altri fusi orari, quindi anziché un globale define(), impostare il loro fuso orario specificato in quanto sopra.valori timestamp saranno convertiti automaticamente da MySQL per il momento la vostra applicazione vede il set di risultati (che a volte può essere un problema, se avete bisogno di sapere in realtà il fuso orario originale dell'evento troppo quindi ha bisogno di essere in un'altra colonna)

e per quanto, "perché non basta memorizzare tutti i tempi come int di", che fa si perde la possibilità di confrontare e convalidare le date, e significa sempre devono convertire in rappresentazione data a livello di applicazione (ed è dura gli occhi quando si sta guardando i dati direttamente - veloce, quello che è successo a 1.254.369,6 mila)


0

in serie php fuso orario da parte nel file php.ini: ini_set("date.timezone", "America/Los_Angeles");

?

o, in particolare, la pagina si può fare come: date_default_timezone_set("America/Los_Angeles");

in MySQL si può fare come: SET GLOBAL time_zone = 'America/Los_Angeles';