Come e perché impostare il timezone in mysql.
Se all’interno del nostro software abbiamo delle query di selezione o inserimento dati utilizzando la data e orario corrente, potrebbe tornare problematico avere il server mysql impostato con un timezone differente da PHP.
Con PHP. per impostare il timezone, possiamo utilizzare la funzione nativa
date_default_timezone_set('Europe/Rome');
Impostando in php questo timezone, avremo sicuramente dei problemi con mysql quando utilizzeremo una query con la funzione interna “NOW()” come da esempio seguente:
INSERT INTO table SET order_id = 1, date_added = "NOW()";
Se eseguiamo la query con il timezone di php (Europe\Rome) alle ore 16.00, mysql salverà la data NOW() come 15.00.
Questo sicuramente comporterà dei problemi in tutti gli applicativi soprattutto se il confronto fra date è la cosa più importante.
Per prima cosa verifichiamo quale timezone è impostato di default e quale orario il server mysql ci ritorna lanciando la seguente query
//timezone
$timezone = mysql_query("SELECT @@global.time_zone, @@session.time_zone", $this->connection);
while ($result = mysql_fetch_assoc($timezone)) {
print_R($result);
}
$orario_corrente = mysql_query("SELECT NOW()");
while ($result = mysql_fetch_assoc($orario_corrente)) {
print_R($result);
}
ed otterremo il seguente risultato
Array
(
[@@global.time_zone] => SYSTEM
[@@session.time_zone] => SYSTEM
)
Array
(
[NOW()] => 2013-01-08 17:18:41
)
N.b: attualmente sono le ore 18:18:41
Ora utilizziamo la seguente query ogni volta che effettuiamo la connessione
$connection = mysql_connect($hostname, $username, $password,true);
mysql_query("SET `time_zone` = '".date('P')."'", $connection);
Abbiamo utilizzato date(‘P’) di PHP, che ritorna nel nostro caso +01:00, così diremo a mysql di impostare questo timezone invece di utilizzare Europe\Rome che potrebbe generare l’errore seguente:
#1298 - Unknown or incorrect time zone: 'Europe/Rome'
Ora effettuando nuovamente la seguente query, otterremo questo risultato:
//timezone
$timezone = mysql_query("SELECT @@global.time_zone, @@session.time_zone", $this->connection);
while ($result = mysql_fetch_assoc($timezone)) {
print_R($result);
}
$orario_corrente = mysql_query("SELECT NOW()");
while ($result = mysql_fetch_assoc($orario_corrente)) {
print_R($result);
}
Array
(
[@@global.time_zone] => SYSTEM
[@@session.time_zone] => +01:00
)
Array
(
[NOW()] => 2013-01-08 18:41:34
)
N.b: ora abbiamo l’orario sincronizzato con il timezone di PHP
Ciao ottimo articolo, solo che ho un problema.
Nel database ho un campo timestamp ‘2013-06-11 05:47:27’, come mai sei imposto SET time_zone = ‘-04:00’ il campo timestamp restituisce ‘2013-06-10 23:47:27’ quindi -6 ore invece di 4?