Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottengo il fuso orario corrente di MySQL?

Dal manuale (sezione 9.6 ):

I valori correnti dei fusi orari globali e specifici del client possono essere recuperati in questo modo:
mysql> SELECT @@global.time_zone, @@session.time_zone;

Modifica Quanto sopra restituisce SYSTEM se MySQL è impostato per utilizzare il fuso orario del sistema, il che è tutt'altro che utile. Dato che stai usando PHP, se la risposta da MySQL è SYSTEM , puoi quindi chiedere al sistema di che fuso orario è utilizzando tramite date_default_timezone_get . (Ovviamente, come ha sottolineato VolkerK, PHP potrebbe essere in esecuzione su un server diverso, ma per ipotesi, 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 è enorme leap.) Ma attenzione che (come con MySQL), è possibile impostare il fuso orario utilizzato da PHP (date_default_timezone_set ), il che significa che potrebbe segnalare un valore diverso da quello utilizzato dal sistema operativo. Se hai il controllo del codice PHP, dovresti sapere se lo stai facendo e stare bene.

Ma l'intera domanda su quale fuso orario sta utilizzando il server MySQL potrebbe essere una tangente, perché chiedere al server in quale fuso orario si trova non ti dice assolutamente nulla sui dati nel database. Continua a leggere per i dettagli:

Ulteriori discussioni :

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 così:

set time_zone = '+00:00';

Ciò imposta il fuso orario su GMT, in modo che qualsiasi ulteriore operazione (come now() ) utilizzerà GMT.

Tieni presente, tuttavia, che i valori di data e ora non memorizzato con 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 conoscere il fuso orario del server è importante solo in termini di funzioni che ottengono l'ora in questo momento, come now() , unix_timestamp() , eccetera.; non ti dice nulla su quale fuso orario stanno usando le date nei dati del database. Potresti scegliere di assumere sono stati scritti utilizzando il fuso orario del server, ma questa ipotesi potrebbe essere errata. Per conoscere il fuso orario di qualsiasi data o ora memorizzata nei dati, devi assicurarti che siano archiviati con le informazioni sul fuso orario o (come faccio io) assicurarti che siano sempre in GMT.

Perché presumere che i dati siano stati scritti utilizzando il fuso orario del server errato? Bene, per prima cosa, i dati potrebbero essere stati scritti utilizzando una connessione che impostava un fuso orario diverso. Il database potrebbe essere stato spostato da un server all'altro, dove i server si trovavano in fusi orari diversi (mi sono imbattuto in quello quando ho ereditato un database che si era spostato dal Texas alla California). Ma anche se i dati sono scritti sul server, con il suo fuso orario corrente, è ancora ambiguo. L'anno scorso, negli Stati Uniti, l'ora legale è stata disattivata alle 2:00 del 1° novembre. Supponiamo che il mio server si trovi in ​​California e utilizzi il fuso orario del Pacifico e io abbia il valore 2009-11-01 01:30:00 nella banca dati. Quando era? Era l'1:30 del 1 novembre PDT o l'1:30 del 1 novembre PST (un'ora dopo)? Non hai assolutamente modo di saperlo. Morale:memorizza sempre date/ora in GMT (che non fa l'ora legale) e converti nel fuso orario desiderato come/quando necessario.