Dal manuale ( sezione 9.6 ):
I valori correnti dei fusi orari globali e specifici del cliente possono essere recuperati in questo modo:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Modifica Quanto sopra restituisce SYSTEM
se MySQL è impostato come slave sul fuso orario del sistema, il che è meno utile. Dato che stai usando PHP, se la risposta di MySQL è SYSTEM
, puoi quindi chiedere al sistema quale fuso orario sta usando date_default_timezone_get
. (Naturalmente, come ha sottolineato VolkerK, PHP potrebbe essere in esecuzione su un server diverso, ma come presuppongono, supponendo che il server Web e il server DB con cui sta parlando siano impostati su [se non effettivamente in ] lo stesso fuso orario non è un enorme salto.) Ma attenzione che (come con MySQL), è possibile impostare il fuso orario utilizzato da PHP (date_default_timezone_set
), il che significa che potrebbe riportare un valore diverso da quello utilizzato dal sistema operativo. Se hai il controllo del codice PHP, dovresti sapere se lo stai facendo ed essere a posto.
Ma l'intera domanda su quale fuso orario sta usando il server MySQL può essere tangente, perché chiedere al server in quale fuso orario si trova non dice assolutamente nulla sui dati nel database. Continua a leggere per i dettagli:
Ulteriore discussione :
Se hai il controllo del server, ovviamente puoi assicurarti che il fuso orario sia una quantità nota. Se non hai il controllo del server, puoi impostare il fuso orario utilizzato dalla tua connessione in questo modo:
set time_zone = '+00:00';
Ciò imposta il fuso orario su GMT, in modo che eventuali ulteriori operazioni (come now()
) utilizzino GMT.
Si noti, tuttavia, che i valori di ora e data non sono memorizzati con le informazioni sul fuso orario in MySQL:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
Quindi, sapendo il fuso orario del server è importante solo in termini di funzioni che ottengono il tempo in questo momento, come ad esempio now()
, unix_timestamp()
, ecc .; non ti dice nulla su quale fuso orario stanno usando le date nei dati del database. Potresti scegliere di supporre che siano stati scritti usando il fuso orario del server, ma tale presupposto potrebbe essere errato. Per conoscere il fuso orario di qualsiasi data o ora memorizzata nei dati, è necessario assicurarsi che siano memorizzati con le informazioni sul fuso orario o (come faccio io) assicurarsi che siano sempre in GMT.
Perché si presume che i dati siano stati scritti utilizzando il fuso orario del server difettoso? Bene, per prima cosa, i dati potrebbero essere stati scritti usando una connessione che imposta un fuso orario diverso. Il database potrebbe essere stato spostato da un server a un altro, in cui i server erano in fusi orari diversi (mi sono imbattuto in quello quando ho ereditato un database che si era trasferito dal Texas alla California). Ma anche se i dati sono scritti sul server, con il suo fuso orario attuale, è ancora ambiguo. L'anno scorso, negli Stati Uniti, l'ora legale è stata disattivata alle 2:00 del 1 novembre. Supponiamo che il mio server sia in California utilizzando il fuso orario del Pacifico e che io abbia il valore2009-11-01 01:30:00
nel database. Quando era? Era l'1: 30 novembre 1 ° PDT o l'1: 30 novembre 1 ° PST (un'ora dopo)? Non hai assolutamente modo di saperlo. Morale: memorizza sempre le date / orari in GMT (che non fa l'ora legale) e converti nel fuso orario desiderato come / quando necessario.