No manual ( seção 9.6 ):
Os valores atuais dos fusos horários globais e específicos do cliente podem ser recuperados assim:
mysql> SELECT @@global.time_zone, @@session.time_zone;
Editar O retorno acima SYSTEM
se o MySQL estiver definido como escravo do fuso horário do sistema, o que é menos que útil. Como você está usando PHP, se a resposta do MySQL for SYSTEM
, você pode perguntar ao sistema que fuso horário está usando date_default_timezone_get
. (Claro que, como VolkerK apontou, PHP pode ser executado em um servidor diferente, mas como hipóteses ir, assumindo que o servidor web eo servidor de DB que está falando está definido para [se não for realmente no ] o mesmo fuso horário não é um grande salto.) Mas cuidado com o fato de que (como no MySQL), você pode definir o fuso horário que o PHP usa (date_default_timezone_set
), o que significa que ele pode relatar um valor diferente do que o sistema operacional está usando. Se você está no controle do código PHP, deve saber se está fazendo isso e ficar bem.
Mas toda a questão de qual fuso horário o servidor MySQL está usando pode ser uma tangente, porque perguntar ao servidor em que fuso horário está localizado não diz absolutamente nada sobre os dados no banco de dados. Leia para obter detalhes:
Discussão adicional :
Se você está no controle do servidor, é claro que pode garantir que o fuso horário seja uma quantidade conhecida. Se você não estiver no controle do servidor, poderá definir o fuso horário usado por sua conexão desta maneira:
set time_zone = '+00:00';
Isso define o fuso horário como GMT, para que quaisquer operações adicionais (como now()
) usem GMT.
Observe, porém, que os valores de hora e data não são armazenados com informações de fuso horário no 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)
Então, sabendo o fuso horário do servidor só é importante em termos de funções que ficam o tempo agora, como now()
, unix_timestamp()
, etc .; não informa nada sobre o fuso horário que as datas nos dados do banco de dados estão usando. Você pode optar por assumir que eles foram gravados usando o fuso horário do servidor, mas essa suposição pode ser falha. Para conhecer o fuso horário de quaisquer datas ou horários armazenados nos dados, você deve garantir que eles sejam armazenados com informações de fuso horário ou (como eu) garantir que eles estejam sempre no GMT.
Por que assumir que os dados foram gravados usando o fuso horário do servidor com defeito? Bem, por um lado, os dados podem ter sido gravados usando uma conexão que define um fuso horário diferente. O banco de dados pode ter sido movido de um servidor para outro, onde os servidores estavam em fusos horários diferentes (eu o encontrei quando herdei um banco de dados que foi movido do Texas para a Califórnia). Mas mesmo que os dados sejam gravados no servidor, com seu fuso horário atual, ainda são ambíguos. No ano passado, nos Estados Unidos, o horário de verão foi desativado às 02:00 de 1º de novembro. Suponha que meu servidor esteja na Califórnia usando o fuso horário do Pacífico e eu tenha o valor2009-11-01 01:30:00
no banco de dados. Quando foi isso? Isso era 01:30 de 1 de novembro PDT ou 1:30 de 1 de novembro de PST (uma hora depois)? Você não tem absolutamente nenhuma maneira de saber. Moral: sempre armazene datas / horas no GMT (que não executa o horário de verão) e converta para o fuso horário desejado conforme / quando necessário.