Por algum motivo, no meu código, no topo da página, há date_default_timezone_set('America/Belize');
e não quero alterá-lo.
Para obter os segundos atuais de Londres a partir da meia-noite (ou qualquer outro fuso horário), independentemente do estado em que estou, tentei usar uma pequena função (apenas um pouco modificada) encontrada aqui no StackOverflow:
function seconds_from_midnight($iana_timezone = 'Europe/London'){
$time_now = time(); //UNIX TIMESTAMP (IT'S THE SAME EVERYWHERE)
$date = new DateTime();
$date->setTimestamp( $time_now );
$date->setTimezone(new DateTimeZone($iana_timezone));
$date->modify('today midnight');
$midnight_time = $date->getTimestamp();
$seconds_since_midnight = $time_now - $midnight_time;
return $seconds_since_midnight;
}
Acho que a primeira parte está correta porque usa um timestamp unix (UTC-0 a partir de 1970).
Então eu verifico a hora em Londres com (essa parte está completamente errada):
$r = seconds_from_midnight();
echo 'Time London now: '.date('H:i:s', $r).'<br>'; //How to do this for each state?
[Deveria ser a hora correta se você for uma pessoa em Londres que esteja olhando para o relógio agora]
Agora veja o problema que ocorre:
date
refere-se ao servidor, então me retorna um horário errado (não sei por que, mas acho que o motivo de estar date_default_timezone_set
no começo da página é que não quero alterar).
Atenção : O fuso horário fornecido pela variável $iana_timezone
pode ser diferente de Europe/London
.
Eu não moro nos Estados Unidos/Belize e o servidor PHP está em outro estado (não sei qual e honestamente não me importo).
Então, como saber a hora a partir da meia-noite em Londres (ou em outro estado) nessas condições?
Sua função retorna o resultado correto , mas sua verificação indireta não está totalmente correta.
date('H:i:s', $r)
não contém informações de fuso horário, então ele usa o fuso horário padrão (América/Belize). Mas, para começar, você está usando uma quantidade relativa de segundos como um horário Unix absoluto. Você está basicamente tomando o Unix Epoch como ponto de partida, extraindo um horário de 1º de janeiro de 1970 e imprimindo-o no fuso horário padrão atual. O Unix Epoch em Belize não aconteceu nem perto da meia-noite, então o horário impresso está muito fora do caminho.Mesmo que você altere o fuso horário padrão temporariamente para esta tarefa, Londres está usando o horário de verão no momento, então ele estará 1 hora atrasado. Ele funcionará por puro acaso depois do último domingo de outubro e quebrará novamente em março.
Se você precisar lidar com fusos horários diferentes, use
DateTime
todo o caminho.