Como faço para definir o fuso horário do MySQL?

339

Em um servidor, quando eu executo:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 16:54:29 |
+---------------------+
1 row in set (0.00 sec)

Em outro servidor:

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-05-30 20:01:43 |
+---------------------+
1 row in set (0.00 sec)
AMD
fonte
Não há apenas uma diferença de fuso horário aqui - mas um desvio de tempo não tão insignificante também: "Converse com seu DBA sobre ntp- e veja o que é certo para você!"
Colm.anseo
@ colm.anseo Calma, provavelmente é a diferença entre executar as consultas
HosseyNJF
11
@HosseyNJF por 7 minutos? Intervalo para café entre comparações?
colm.anseo

Respostas:

525

Eu pensei que isso poderia ser útil:

Existem três locais onde o fuso horário pode ser definido no MySQL:

No arquivo "my.cnf" na seção [mysqld]

default-time-zone='+00:00'

variável @@ global.time_zone

Para ver em que valor eles estão definidos:

SELECT @@global.time_zone;

Para definir um valor para ele, use um dos seguintes:

SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone = '+00:00';

(Usar fusos horários nomeados como 'Europa / Helsinque' significa que você precisa ter uma tabela de fuso horário devidamente preenchida.)

Lembre-se de que +02:00é um deslocamento. Europe/Berliné um fuso horário (que possui duas compensações) e CESTuma hora do relógio que corresponde a um deslocamento específico.

variável @@ session.time_zone

SELECT @@session.time_zone;

Para configurá-lo, use um dos seguintes:

SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";

Ambos podem retornar SYSTEM, o que significa que eles usam o fuso horário definido em my.cnf.

Para que os nomes de fuso horário funcionem, você deve configurar suas tabelas de informações de fuso horário: http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html . Menciono também como preencher essas tabelas nesta resposta .

Para obter o deslocamento do fuso horário atual como TIME

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);

Ele retornará 02:00:00 se o seu fuso horário for +2: 00.

Para obter o registro de data e hora atual do UNIX:

SELECT UNIX_TIMESTAMP();
SELECT UNIX_TIMESTAMP(NOW());

Para obter a coluna do registro de data e hora como um registro de data e hora do UNIX

SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`

Para obter uma coluna de data e hora UTC como um carimbo de data / hora UNIX

SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`

Nota: Alterar o fuso horário não alterará a data e hora armazenadas , mas mostrará um diferente para as colunas de carimbo de data / hora existentes, pois elas são armazenadas internamente como carimbos de data / hora UTC e exibidas externamente no fuso horário atual do MySQL.

Fiz uma folha de dicas aqui: O MySQL deve ter seu fuso horário definido como UTC?

Timo Huovinen
fonte
3
+00:00não é um fuso horário, é um deslocamento de tempo. O que acontece com relação ao horário de verão? Ele fica em +0 o ano todo?
MPEN
11
@ Mark Não tenho certeza, os documentos dizem que, ao definir time_zone="+00:00"o fuso horário usando um deslocamento do UTC, considerando que o valor definido nunca muda e que o UTC não segue o horário de verão, posso assumir que ele permanece o mesmo durante todo o ano.
Timo Huovinen 14/03
11
@TimoHuovinen Desculpe, eu quis dizer que isso +00:00 parece um deslocamento, então é meio estranho o MySQL escolher isso para representar o UTC em vez de apenas usar a própria string "UTC". Obrigado pela informação.
MPEN
11
Defino +00: 00, mas recebo este erro: erro: Opção encontrada sem o grupo anterior no arquivo de configuração: /etc/my.cnf
János
5
em Win7, o caminho para o arquivo de configurações MySQL éC:\ProgramData\MySQL\MySQL Server x.x\my.ini
oabarca
82

Para quem ainda está com esse problema:

value="jdbc:mysql://localhost:3306/dbname?serverTimezone=UTC"

Trabalhou para mim. Basta acrescentar ?serverTimezone=UTCno final.

Noel Murphy
fonte
Se meu fuso horário for UTC + 7, como eu poderia especificar isso na cadeia de conexão? Tentei anexar "? ServerTimezone = UTC + 7" e não funciona.
Chiến Nghê
11
A questão não era sobre JDBC, mas sobre o próprio MySQL.
Luiz
2
@ ChiếnNghê: Você deve usar em Asia/Ho_Chi_Minhvez de UTCBTW, a questão é mudar o fuso horário do MySQL. Então, veja a resposta do @Timo. Se você tiver problemas com o docker MySQL, adicione o ambiente TZ e ele deverá funcionar.
quer
2
Isso apenas informa ao JDBC qual é o fuso horário do servidor, não o altera. Para definir o fuso horário da sessão, verifique as respostas que usam #SET time_zone=...
Nikola Mihajlović
Eu estava recebendo um erro CDT, mas isso foi corrigido para mim.
Akexis 02/11/19
58

Quando você pode configurar o servidor de fuso horário para MySQL ou PHP:

Lembrar:

  1. Alterar sistema de fuso horário. Exemplo para Ubuntu:

    $ sudo dpkg-reconfigure tzdata
  2. Reinicie o servidor ou você pode reiniciar o Apache 2 e o MySQL:

    /etc/init.d/mysql restart
Jane
fonte
2
Talvez essa abordagem não seja a correta. Pense na situação de ter um servidor com UTC, mas seu aplicativo está servindo dados para um país no UTC -0600. Ajustar o fuso horário para o MySQL, poderia ser muito melhor.
ivanleoncz
11
Especialmente se você trabalha em uma área que abrange vários fusos horários.
Alexis Wilke
57

Para configurá-lo para a sessão atual, faça:

SET time_zone = timezonename;
James Skidmore
fonte
14
SELECT @@ session.time_zone;
James Skidmore
11
Estou tentando corrigir alguns erros no meu sistema e preciso definir meu time_zone como UTC, não GMT. Você sabe que se eu definir '-0: 00' ou '+00: 00', isso é uma anotação UTC ou GMT? Eu meio que NÃO estou encontrando essas informações específicas. Felicidades!
Rafa.ferreira
@ Castanho, tenho certeza que qualquer um deles funcionará bem. Confira a explicação sobre esta questão: stackoverflow.com/questions/3466630/...
James Skidmore
O valor para o fuso horário pode ser o mesmo que o definido no PHP, como SET time_zone = 'America/Boise'. Obrigado pela resposta, James Skidmore!
Adam F
11
@the_nuts sim, o SET time_zone = 'UTC';cenário se perde durante a reinicialização do servidor
Timo Huovinen
48

Simplesmente execute isto no seu servidor MySQL:

SET GLOBAL time_zone = '+8:00';

Onde +8: 00 será o seu fuso horário.

Rico Chan
fonte
14
Note, que este é apenas temporária até que você reinicie Mysql
rubo77
Raramente se tem privilégios de superusuário ao se conectar a um banco de dados. Definir @@session.time_zonecomo descrito em outras respostas é uma rota muito melhor.
colm.anseo 5/06/19
16

Este trabalho para mim para um local na Índia:

SET GLOBAL time_zone = "Asia/Calcutta";
SET time_zone = "+05:30";
SET @@session.time_zone = "+05:30";
Swapnil Bijwe
fonte
você precisa executá-lo como uma consulta no mysql ou escrever no my.conf com a seguinte sintaxe default-time-zone = '+05: 30'
#
11

Lembre-se de que 'Country / Zone' não está funcionando às vezes ... Esse problema não depende do sistema operacional, da versão MySQL e do hardware - eu o conheço desde o FreeBSD 4 e o Slackware Linux no ano de 2003 até hoje. MySQL da versão 3 até o último tronco de origem. É ímpar, mas acontece. Por exemplo:

root@Ubuntu# ls -la /usr/share/zoneinfo/US
total 8

drwxr-xr-x  2 root root 4096 Apr 10  2013 .
drwxr-xr-x 22 root root 4096 Apr 10  2013 ..
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Alaska -> ../SystemV/YST9YDT
lrwxrwxrwx  1 root root   21 Jul  8 22:33 Aleutian -> ../posix/America/Adak
lrwxrwxrwx  1 root root   15 Jul  8 22:33 Arizona -> ../SystemV/MST7
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Central -> ../SystemV/CST6CDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Eastern -> ../SystemV/EST5EDT
lrwxrwxrwx  1 root root   37 Jul  8 22:33 East-Indiana -> ../posix/America/Indiana/Indianapolis
lrwxrwxrwx  1 root root   19 Jul  8 22:33 Hawaii -> ../Pacific/Honolulu
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Indiana-Starke -> ../posix/America/Knox_IN
lrwxrwxrwx  1 root root   24 Jul  8 22:33 Michigan -> ../posix/America/Detroit
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Mountain -> ../SystemV/MST7MDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   18 Jul  8 22:33 Pacific-New -> ../SystemV/PST8PDT
lrwxrwxrwx  1 root root   20 Jul  8 22:33 Samoa -> ../Pacific/Pago_Pago
root@Ubuntu#

E uma declaração como essa deve funcionar:

SET time_zone='US/Eastern';

Mas você tem este problema:

Código de erro: 1298. Fuso horário desconhecido ou incorreto: 'EUS / Eastern'

Dê uma olhada na subpasta no diretório de informações da zona e consulte o nome do arquivo ACTUAL para o link simbólico; nesse caso, é EST5EDT. Em seguida, tente esta declaração:

SET time_zone='EST5EDT';

E está realmente funcionando como deveria! :) Lembre-se desse truque; Eu não vi isso documentado nos manuais do MySQL e na documentação oficial. Mas ler a documentação correspondente é algo obrigatório: documentação oficial do fuso horário do MySQL 5.5 - e não se esqueça de carregar dados do fuso horário no seu servidor assim (execute como usuário root!):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

Truque número um - deve ser feito exatamente sob o usuário root do MySQL. Pode falhar ou produzir resultados não funcionais, mesmo a partir do usuário que tem acesso total a um banco de dados MySQL - eu mesmo vi a falha.

Alexey Vesnin
fonte
Por favor, diga-me seu uname -a e mais detalhes - tenha alguns casos de trabalho no desktop e servidor Ubuntu.
Alexey Vesnin
7

Esta é uma pergunta de 10 anos, mas de qualquer maneira, aqui está o que funcionou para mim. Estou usando o MySQL 8.0 com Hibernate 5 e SpringBoot 4.

Eu tentei a resposta aceita acima, mas não funcionou para mim, o que funcionou para mim é o seguinte:

db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Europe/Warsaw

Se isso ajudar você não se esqueça de votar novamente: D

sabre de hamza
fonte
4

Pergunta antiga com mais uma sugestão:

Se você alterou recentemente o fuso horário do sistema operacional, por exemplo, via:

unlink /etc/localtime
ln -s /etc/usr/share/zoneinfo/US/Eastern /etc/localtime

... O MySQL (ou MariaDB) não notará até que você reinicie o serviço db:

service mysqld restart

(ou)

service mariadb restart
inanutshellus
fonte
3

Se você estiver usando o MySql Workbench, poderá definir isso abrindo a visualização do administrador e selecionando a guia Avançado. A seção superior é "Localização" e a primeira caixa de seleção deve ser "fuso horário padrão". Marque essa caixa e digite o fuso horário desejado, reinicie o servidor e você deve estar pronto.

Taylor Lafrinere
fonte
2
O problema está relacionado ao MySQL, não a um programa específico.
fedorqui 'Então, pare de prejudicar'
3
Não encontrou nada parecido.
precisa saber é o seguinte
11
Nada disso
Verde
Para MySQL Workbench 6.3: Instância => Arquivo de opções => Geral => Internacional
paulus
5
[ ATUALIZAÇÃO para MySQL Workbench 8.0 ] Selecione "Servidor" => "Arquivo de opções" e, na guia "Geral", veja abaixo a seção "Internacional" . Haverá uma caixa de seleção "fuso horário padrão" junto com o campo relacionado. Assim, você pode definir o valor padrão do fuso horário lá.
informatik01
3

Primeiro, para descobrir qual é o time_zone, você pode consultar

SHOW VARIABLES LIKE '%time_zone%'; 

Sua saída deve ser semelhante à seguinte

**Variable_name**     **Value**
system_time_zone      CDT
time_zone             SYSTEM

Então, se você deseja confirmar que está em algum fuso horário, como CDT, em vez de algo como EST, pode verificar a que horas acha que está sua máquina dizendo

SELECT NOW();

Se não é o momento que você deseja, você precisa alterá-lo ... tudo o que você precisa fazer é SET time_zone = timezone_name. Verifique se ele está no Continent/Cityformato.

Se você estiver em um servidor compartilhado porque possui um serviço de hospedagem, consulte estas respostas para alterar o arquivo php.ini ou o arquivo .htaccess.

Erik Toor
fonte
11
Eu tentei mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p Eprimeiro e depois SET time_zone = timezone_namefuncionou bem.
Barakat Turki
1

Você precisa configurar o fuso horário da sua localização. Para seguir o processo abaixo,
abra o MSQLWorkbench e escreva um comando sql simples como este;

select now();

E também seu URL pode ser assim;

url = "jdbc:mysql://localhost:3306/your_database_name?serverTimezone=UTC";
harun ugur
fonte
@LuFFy é isso que eu estava pensando, então, para cada conexão de banco de dados, o fuso horário deve ser definido SE estivermos usando o fuso horário do escopo da sessão e não o fuso horário do escopo 'global'. É bom usar o escopo da sessão se o aplicativo puder ter usuários em fusos horários diferentes, certo?
Valter Ekholm
1

Para definir o fuso horário padrão no MariaDB, você deve acessar o arquivo 50-server.cnf .

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Então você pode inserir a seguinte entrada na seção mysqld.

default-time-zone='+01:00'

Exemplo:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

### Default timezone ###
default-time-zone='+01:00'

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

A alteração deve ser feita através do arquivo de configuração, caso contrário, o servidor MariaDB redefinirá as tabelas mysql após uma reinicialização!

Lukas Kuntze
fonte
1

Edite o arquivo de configuração do MySQL

sudo nano /etc/mysql/my.cnf

Role e adicione-os à parte inferior. Alterar para o fuso horário relevante

[mysqld]
default-time-zone = "+00:00"

Reinicie o servidor

sudo service mysql restart
Ivan_ug
fonte
0

No Windows (IIS), para poder SET GLOBAL time_zone = 'Europe / Helsinki' (ou qualquer outro), as tabelas de descrição do MySQL time_zone precisam ser preenchidas primeiro.

Eu os baixei deste link https://dev.mysql.com/downloads/timezones.html

Depois de executar a consulta SQL baixada, consegui definir o time_zone GLOBAL e resolver o problema que eu tinha onde SELECT NOW (); estava retornando GMT em vez de BST.

Stewart Kirkpatrick
fonte
Eu poderia usar o formato numérico "+01: 00" em vez de "Europa / Estocolmo" para não precisar descarregar tabelas de descrição do time_zone, eu acho.
Valter Ekholm
0

No meu caso, a solução foi definir o parâmetro serverTimezone nas configurações avançadas para um valor apropriado (CET para o meu fuso horário).

Enquanto uso o IntelliJ, uso o módulo Banco de Dados. Ao adicionar uma nova conexão ao banco de dados e depois de adicionar todos os parâmetros relevantes na guia Geral, ocorreu um erro no botão "Testar Conexão". Novamente, a solução é definir o parâmetro serverTimezone na guia Avançado.

ognjenkl
fonte
0

Se alguém estiver usando o GoDaddy Shared Hosting, você pode tentar a seguinte solução, funcionou para mim.

Ao iniciar a conexão com o banco de dados, defina o comando time_zone no meu objeto PDO, por exemplo:

$pdo = new PDO($dsn, $user, $pass, $opt);
$pdo->exec("SET time_zone='+05:30';");

Onde "+05: 30" é o fuso horário da Índia. Você pode alterá-lo conforme sua necessidade.

Depois disso; todos os processos do MySQL relacionados à data e hora são definidos com o fuso horário necessário.

Fonte: https://in.godaddy.com/community/cPanel-Hosting/How-to-change-TimeZone-for-MySqL/td-p/31861

Ashish Pandey
fonte