Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como obtenho o fuso horário atual do MySQL?


Do 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 acima retorna SYSTEM se o MySQL estiver configurado para usar o fuso horário do sistema, o que é menos do que útil. Como você está usando PHP, se a resposta do MySQL for SYSTEM , você pode perguntar ao sistema qual é o fuso horário é usando via date_default_timezone_get . (É claro que, como VolkerK apontou, o PHP pode estar sendo executado em um servidor diferente, mas como suposições, assumindo que o servidor web e o servidor de banco de dados com o qual ele está falando estão definidos para [se não for realmente em ] o mesmo fuso horário não é enorme jump.) Mas cuidado que (como no MySQL), você pode definir o fuso horário que o PHP usa (date_default_timezone_set ), o que significa que pode relatar um valor diferente do que o sistema operacional está usando. Se você está no controle do código PHP, você 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 ele está diz absolutamente nada sobre os dados do banco de dados. Leia para 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 pela sua conexão assim:
set time_zone = '+00:00';

Isso define o fuso horário para GMT, para que quaisquer outras operações (como now() ) usará GMT.

Observe, porém, que os valores de hora e data não armazenado 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)

Portanto, conhecer o fuso horário do servidor é importante apenas em termos de funções que obtêm a hora agora, como now() , unix_timestamp() , etc; ele não informa nada sobre qual fuso horário as datas nos dados do banco de dados estão usando. Você pode optar por assumir eles foram escritos usando o fuso horário do servidor, mas essa suposição pode ser falha. Para saber o fuso horário de quaisquer datas ou horas armazenadas nos dados, você precisa garantir que eles sejam armazenados com informações de fuso horário ou (como eu) garantir que estejam sempre em GMT.

Por que assumir que os dados foram gravados usando o fuso horário do servidor é falho? Bem, por um lado, os dados podem ter sido gravados usando uma conexão que definiu 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 (deparei com isso quando herdei um banco de dados que se mudou do Texas para a Califórnia). Mas mesmo que os dados são gravados no servidor, com seu fuso horário atual, ainda é ambíguo. No ano passado, nos Estados Unidos, o horário de verão foi desativado às 2h do dia 1º de novembro. Suponha que meu servidor esteja na Califórnia usando o fuso horário do Pacífico e eu tenha o valor 2009-11-01 01:30:00 no banco de dados. Quando foi isso? Isso foi 1h30 de 1º de novembro PDT ou 1h30 de 1º de novembro PST (uma hora depois)? Você não tem absolutamente nenhuma maneira de saber. Moral:Sempre armazene datas/horas em GMT (que não faz DST) e converta para o fuso horário desejado conforme/quando necessário.