Domanda

Per quelli di noi che utilizzano pacchetti di hosting condiviso standard, come GoDaddy o Network Solutions, come gestisci le conversioni di data e ora quando il tuo server di hosting (PHP) e il server MySQL si trovano 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 una variabile datetime in modo appropriato?

È stato utile?

Soluzione

A partire da PHP 5.1.0 puoi usare 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 Supporto del fuso orario del server MySQL pagina)

Prima di MySQL 4.1.3, il server funziona solo nel fuso orario del sistema impostato all'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.

Ti interessa l'impostazione dei fusi orari per connessione, che utilizzeresti all'inizio dei tuoi script

SET timezone = 'Europe/London';

Per quanto riguarda il rilevamento dell'impostazione del fuso orario del client, potresti utilizzare un po' di JavaScript per ottenere e salvare tali informazioni in un cookie e utilizzarle nelle successive letture 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 potresti offrire agli utenti la possibilità di impostare autonomamente il proprio fuso orario.

Altri suggerimenti

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

php - data

mysql - utc-timestamp

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

Altrimenti sei limitato a offset numerici come '-4:00'.Fortunatamente il formato php date('P') lo fornisce (a partire dalla versione 5.1.3)

Quindi, diciamo, un file di configurazione dell'app che potresti 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 che PHP e MySQL concorderanno su quale fuso orario utilizzare.

Utilizzare sempre TIMESTAMP per memorizzare i valori temporali.La colonna viene effettivamente archiviata come UNIX_TIME (epoch) ma convertita implicitamente dall'offset time_zone corrente quando scritta e indietro quando letta.

Se desideri visualizzare gli orari per gli utenti in altri fusi orari, invece di una define() globale, imposta il fuso orario specificato in precedenza.I valori TIMESTAMP verranno convertiti automaticamente da mySQL nel momento in cui la tua app vedrà il set di risultati (il che a volte può essere un problema, se hai bisogno di conoscere effettivamente anche il fuso orario originale dell'evento, allora deve essere in un'altra colonna)

e per quanto riguarda "perché non memorizzare tutti gli orari come int", ciò ti fa perdere la capacità di confrontare e convalidare le date e significa che Sempre devo convertire la rappresentazione della data a livello di app (ed è difficile per gli occhi quando guardi direttamente i dati: veloce, cosa è successo a 1254369600?)

Salvo tutte le mie date come bigint perché ho già avuto problemi con il tipo dateTime.Ci salvo il risultato della funzione PHP time(), ora contano come se fossero nello stesso fuso orario :)

In php imposta il fuso orario nel file php.ini: ini_set("date.timezone", "America/Los_Angeles");

o in una pagina particolare puoi fare come: date_default_timezone_set("America/Los_Angeles");

In MySQL puoi fare come: SET GLOBAL time_zone = 'America/Los_Angeles';

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top