A que horas está o servidor, e porque é que o PHP e o MySQL podem discordar

Um formulário que grava a hora errada, uma encomenda com data de ontem, um agendamento que dispara duas horas mais cedo — quase sempre é a mesma coisa: num servidor não há um relógio, há três, e não têm de estar todos no mesmo fuso.

Os três relógios

Relógio Quem o usa
O do sistema A hora da máquina. Aparece nos registos do servidor e nas datas dos ficheiros.
O do PHP O que o seu site usa quando chama date(). É este que manda no seu site, e não tem de coincidir com o do sistema.
O da base de dados O que o MySQL usa em NOW() e CURRENT_TIMESTAMP.
É aqui que nascem as horas trocadas. Se uma parte do seu site grava a hora com o PHP e outra deixa a base de dados preencher com NOW(), e os dois relógios não estiverem no mesmo fuso, ficam registos com horas diferentes para o mesmo acontecimento. Não dá erro nenhum — só se descobre quando alguém repara que as contas não batem. Se o seu site grava datas, vale a pena confirmar isto antes de precisar delas.

Como saber o seu, em dois minutos

Não adivinhe: o valor certo é o da sua conta. Crie um ficheiro chamado hora.php em public_html com estas linhas:

<?php
echo 'PHP: ' . date('Y-m-d H:i:s T') . ' (' . date_default_timezone_get() . ')<br>';
$db = new mysqli('localhost','UTILIZADOR','SENHA','BASE');
echo 'MySQL: ' . $db->query('SELECT NOW()')->fetch_row()[0];
1 Substitua o utilizador, a senha e o nome da base pelos da sua conta — ver bases de dados e phpMyAdmin.
2 Abra oseudominio.co.mz/hora.php no navegador.
3 Compare as duas linhas. Se não baterem certo, é esse o problema que anda a perseguir.
4 Apague o ficheiro depois. Ele contém a senha da base de dados — não pode ficar lá.

Como pôr o seu site na hora que quer

Não precisa de nos pedir nada: cada conta pode escolher a sua, e não afecta ninguém.

Onde Como
WordPress Em Definições → Geral, escolha a cidade na lista de fusos. O WordPress passa a mostrar tudo nessa hora, independentemente do servidor. É a forma mais simples e cobre a maior parte dos casos.
Site em PHP próprio Uma linha no início: date_default_timezone_set('Africa/Maputo') — ou a cidade que lhe servir.
Todo o domínio de uma vez No cPanel, em MultiPHP INI Editor, defina date.timezone para o domínio. Passa a valer para todos os ficheiros PHP dele — ver como mudar a versão do PHP
Só numa consulta SQL Convertendo na própria consulta, com CONVERT_TZ().
O fuso certo para estes mercados. Use Africa/Maputo para Moçambique e Africa/Luanda para Angola. Não escreva «UTC+2» nem «UTC+1» à mão: o nome da cidade é melhor porque acompanha sozinho qualquer mudança de regra no futuro. Nenhum dos dois países tem hora de Verão, mas quem tem visitantes na Europa ganha em usar o nome, porque lá a hora muda duas vezes por ano.

A hora nos e-mails e nos registos

Duas coisas que não se mudam a partir do site, e é bom saber:

1 Nas mensagens de e-mail, a hora vai com o fuso indicado no cabeçalho, e cada programa de correio mostra-a convertida para o fuso de quem lê. Por isso a mesma mensagem aparece a horas diferentes em computadores diferentes — e isso está correcto.
2 Nos registos do servidor — os que abrimos quando nos pede ajuda — a hora é a do sistema. Quando nos escrever sobre um problema, diga a hora e o fuso em que a viu. Poupa-nos a procurar duas horas ao lado.

Se precisa de mandar no relógio todo

Num plano partilhado, a hora do sistema é comum a toda a máquina e não se muda por conta — o que se muda é a do PHP e a das consultas, que é o que interessa a 99% dos sites. Se a sua aplicação exige mesmo que o sistema inteiro esteja noutro fuso, isso é um servidor só seu: ver alojamento partilhado ou VPS.

As horas do seu site não batem certo? Mostre-nos o exemplo.

Abrir um pedido

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 600,00 MT/mês

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?