Trabalhar com Horário GMT

Amigos fiz uma busca mas não encontrei muita coisa, de certa forma tbm sou um pouco leigo no assunto. Vai a situação:

Tenho um campo na tabela que grava data e hora e preciso transformar conforme horário de cada estado.

Alguém tem ideia de como poderia ser feito?

na sua tabela de estados, grave a diferença de fuso horário em horas, a data inicial e final de horário de verão.

ao salvar os dados no banco adicione a diferença de fuso + a diferença de horário de verão.

Certo, mas como será o calculo no sc?
Tenho uma data no formato 2013-12-19 01:28:00, por exemplo. Como seria o calculo e onde seria colocado.

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.

Mas Ale, e quando usa o now() do mysql?
De qualquer forma tem que saber o timezone do usuario.

Salvando a diferença em fuso, tipo são paulo co horario de verão esta em +1hora, criando duas funções uma php e outra sql, buscando o estado de acesso, basta somar ou subtrsir esse valor da data hora corrente.

Haroldo,
Depois de receber muitos pedidos de ajuda no fórum e alguns nem manifestarem um obrigado ou retornar se deu certo. Eu não dou mais soluções completas.
Me desculpem os amigos que participam de verdade no Fórum.
Eu já fui ativista de compartilhar soluções, mas depois de certo tempo cansa.

No mysql tem como dizer qual timezone usar nas querys.
Agora! Como saber em qual timezone a data foi gravada é um dever de casa quando não se usa UTC (GMT)!
Mas posso dizer que é coisa simples.
Sobre isto, Haroldo, converso com você fora do Fórum e envio um exemplo funcional.
Fiz uma tabela simples somente para guardar o codigo e a data.
No scriptcase uso o seguinte select:

SELECT
codigo,
datahora,
now()
FROM
timezone

Como pode ver faço uso do NOW();

Para isto funcionar a conexão ao banco tem que ser persistente.

Agora veja o resultado: http://www.simaoebuhler.com.br/teste/timezone
Clique nos botões: Hora Bahia, Hora Curitiba, Hora Bo vista e Hora Rio Branco.
Pode ver que após o ok a hora muda tanto no select dos dados armazenados no banco quanto no NOW() que pega a hora do servidor.
Tudo sem usar nenhuma função no php para isto, somente uma única função no Mysql.

Por isto que eu digo.
Saber scriptcase é fácil.
Aprender a usar o SGDB e a linguagem de programação já não é para qualquer um.
Ler o manual da linguagem de programação e do SGDB então…!?
Fazer o que né?
Um dia eu faço o dever de casa e leio os manuais.

Obs: no exemplo postado não estou gravando as horas em UTC(GMT). Logo, se usar o form pode haver discrepâncias.
Somente postei o exemplo para vocês verem que o mysql pode gerenciar bem timezones. Assim como o php faz.

Alexandre, concordo com vc, infelizmente isso é fato.

Obrigado pelo ajuda de todos, vou ver qual a melhor solução para implementar.

Se quiserem pode dar o tópico como encerrado.

A propósito, um amigo tbm indicou a classe nativa do php datetime.