Pergunta de acompanhamento de /server/191331/should-servers-have-their-timezone-set-to-gmt-utc
O fuso horário do MySQL deve estar definido como UTC ou o mesmo fuso horário que o servidor ou PHP está definido? (Se não for UTC)
Quais são os prós e contras?
Respostas:
Parece que não importa qual fuso horário está no servidor, desde que você tenha o horário definido para o fuso horário atual, saiba o fuso horário das colunas de data e hora armazenadas e esteja ciente dos problemas com o horário de verão.
Por outro lado, se você tiver o controle dos fusos horários dos servidores com os quais trabalha, poderá definir tudo internamente para o UTC e nunca se preocupar com fusos horários e horário de verão.
Aqui estão algumas anotações que coletei sobre como trabalhar com fusos horários como uma forma de cheatsheet para mim e para outras pessoas que podem influenciar o fuso horário que a pessoa escolherá para o servidor e como armazenará data e hora.
Cheatsheet do MySQL Timezone
Notas:
GMT confunde segundos, e é por isso que o UTC foi inventado.
Aviso! fusos horários regionais diferentes podem produzir o mesmo valor de data e hora devido ao horário de verão
Internamente, uma coluna de registro de data e hora do MySQL é armazenada como UTC, mas ao selecionar uma data, o MySQL o converterá automaticamente no fuso horário da sessão atual.
Ao armazenar uma data em um registro de data e hora, o MySQL assumirá que a data está no fuso horário da sessão atual e a converterá em UTC para armazenamento.
Para selecionar uma coluna de carimbo de data / hora no formato UTC
não importa em que fuso horário está a sessão atual do MySQL:
Você também pode definir o fuso horário da sessão global ou global ou atual como UTC e selecionar o carimbo de data e hora da seguinte forma:
Para selecionar a data e hora atual no UTC:
Resultado de exemplo:
2015-03-24 17:02:41
Para selecionar o horário atual no fuso horário da sessão
Para selecionar o fuso horário definido quando o servidor foi iniciado
Retorna "MSK" ou "+04: 00" para o horário de Moscou, por exemplo, existe (ou houve) um erro do MySQL em que, se definido como um deslocamento numérico, não ajustaria o horário de verão
Para obter o fuso horário atual
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 (em segundos):
Para obter a coluna do registro de data e hora como um registro de data e hora do UNIX
Para obter uma coluna de data e hora UTC como um carimbo de data / hora UNIX
Obter uma data e hora atuais do fuso horário de um número inteiro de carimbo de data / hora UNIX positivo
Obter uma data e hora UTC de um registro de data e hora UNIX
Obter uma data e hora do fuso horário atual de um número inteiro de carimbo de data e hora UNIX negativo
Existem 3 locais onde o fuso horário pode ser definido no MySQL:
Nota: Um fuso horário pode ser definido em 2 formatos:
no arquivo "my.cnf"
ou
variável global@time_zone @@
Para ver em que valor eles estão definidos
Para definir um valor para ele, use um dos seguintes:
variável @@ session.time_zone
Para configurá-lo, use um dos seguintes:
ambas as variáveis "@@ global.time_zone" e "@@ session.time_zone" 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 (mesmo para o fuso horário padrão), 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
Nota: você não pode fazer isso, pois retornará NULL:
Configurar tabelas de fuso horário do mysql
Para
CONVERT_TZ
funcionar, você precisa que as tabelas de fuso horário sejam preenchidasSe estiverem vazios, preencha-os executando este comando
se esse comando fornecer o erro " dados muito longos para a coluna 'abreviação' na linha 1 ", poderá ser causado por um caractere NULL sendo anexado no final da abreviação do fuso horário
a correção é para executar isso
(verifique se as regras de dst dos servidores estão atualizadas
zdump -v Europe/Moscow | grep 2011
https://chrisjean.com/updating-daylight-saving-time-on-linux/ )Veja o histórico completo de transição DST (Horário de Verão) para cada fuso horário
CONVERT_TZ
também aplica as alterações necessárias no horário de verão com base nas regras nas tabelas acima e na data em que você usa.Nota:
De acordo com os documentos , o valor que você definiu para o time_zone não muda; se você o define como "+01: 00", por exemplo, o time_zone será definido como um deslocamento do UTC, que não segue o horário de verão. permanecerá o mesmo o ano todo.
Somente os fusos horários nomeados mudarão o horário durante o horário de verão.
Abreviações como
CET
sempre serão de inverno eCEST
verão e +01: 00 sempre serão deUTC
+ 1 hora e ambas não serão alteradas com o horário de verão.O
system
fuso horário será o fuso horário da máquina host em que o mysql está instalado (a menos que o mysql não consiga determiná-lo)Você pode ler mais sobre como trabalhar com o horário de verão aqui
Perguntas relacionadas:
Fontes:
fonte
table
setmodified
= '2016-07-07 08:10 +00: 00'UNIX_TIMESTAMP(NOW());
todos os usos deCONVERT_TZ()
onde um dos parâmetros é `@@ session.time_zone. Para converter de maneira confiável datas e horários UTC em registros de data e hora UNIX, basicamente é necessário definir a sessão time_zone primeiro.Este é um exemplo de trabalho:
fonte
PHP e MySQL têm suas próprias configurações de fuso horário padrão. Você deve sincronizar o tempo entre o banco de dados e o aplicativo da Web, caso contrário, poderá executar alguns problemas.
Leia este tutorial: Como sincronizar seus fusos horários PHP e MySQL
fonte
date_default_timezone_set("America/Los_Angeles");
emysql_query("SET time_zone='" . date('P', time()) . "'");
funcionaram de maneira muito elegante!Os prós e os contras são praticamente idênticos. Depende se você deseja ou não isso.
Cuidado, se o fuso horário do MySQL diferir do horário do seu sistema (por exemplo, PHP), comparar o horário ou a impressão com o usuário envolverá alguns ajustes.
fonte