Eu faço assim:
Rodo o diagnosis.php para ver se a minha tabela de timezone do php é igual a última no http://pecl.php.net/package/timezonedb .
Se não for atualizo ela.
Paro o apache e digito no shell do Debian: php /usr/share/php/peclcmd.php install timezonedb ou php /usr/share/php/peclcmd.php upgrade timezonedb .
Depois reinicio o apache.
O meu phpinfo (diagnosis.php) retorna:
date
date/time support enabled
“Olson” Timezone Database Version 2013.9
Timezone Database external
Default timezone America/Sao_Paulo
Com a timezonedb 2013.9 atualizado sei que o php estará apto a realizar qualquer cálculo para mim em qualquer timezone, bem como as conversões entre os timezones. Respeitando inclusive o horário de verão oficial.
Então na aplicação crio uma tabela “timezone” com todos os timezones existentes no mundo ou no Brasil => http://php.net/manual/pt_BR/timezones.php
Então tenho duas opções:
No cadastro de parâmetros da empresa do cliente ele seta o timezone onde ele está ou deixo um select no login para o cliente dizer em que lugar do mundo ele se encontra. Tudo baseado em um sc_lookup na tabela “timezone” que eu criei.
Transformo esta informação em variável global.
Obs: As datas no SGDB sempre guardo em UTC
Então no ínicio de cada script(aplicação) nos eventos eu seto o timezone que o php irá trabalhar com o uso da variável global:
Ex: date_default_timezone_set(“variavelglobal”);
Onde varivavelglobal pode assumir: America/Sao_Paulo , America/Noronha, America/Bahia e etc.
O resto o php converte para mim sem que eu tenha que fazer qualquer conta.
Obs: nos inserts e updates eu defino o timezone como UTC e depois volto para o timezone padrão do cliente.
Segue um exemplo (http://www.simaoebuhler.com.br/teste/timezone.php) onde pode ver que o php faz a conversão de hora e data para mim.
<?php
echo "Hora em Curitiba: ".date('l jS \of F Y h:i:s A')."
";
date_default_timezone_set("America/Bahia");
echo "Hora na Bahia: ".date('l jS \of F Y h:i:s A')."
";
date_default_timezone_set("America/Boa_Vista");
echo "Hora em Boa Vista: ".date('l jS \of F Y h:i:s A')."
";
date_default_timezone_set("America/Rio_Branco");
echo "Hora em Rio Branco: ".date('l jS \of F Y h:i:s A')."
";
date_default_timezone_set("UTC");
echo "Hora em UTC: ".date('l jS \of F Y h:i:s A')."
";
?>
Com isto a única preocupação que tenho que ter é de manter atualizado o timezone no php ( php /usr/share/php/peclcmd.php upgrade timezonedb ).
O resto o cliente escolhe da mesma forma que podemos escolher o timezone aqui no Fórum em “aparência e o layout” no perfil.