Pergunta

Para aqueles de nós que usam pacotes de hospedagem compartilhada padrão, como GoDaddy ou Network Solutions, como você lida com conversões de data e hora quando seu servidor de hospedagem (PHP) e servidor MySQL estão em fusos horários diferentes?

Além disso, alguém tem algum conselho de práticas recomendadas para determinar em que fuso horário um visitante do seu site está e manipular uma variável de data e hora de maneira adequada?

Foi útil?

Solução

A partir do PHP 5.1.0 você pode usar date_default_timezone_set() função para definir o fuso horário padrão usado por todas as funções de data/hora em um script.

Para MySql (citado em Suporte ao fuso horário do servidor MySQL página)

Antes do MySQL 4.1.3, o servidor operava apenas no fuso horário do sistema definido na inicialização.A partir do MySQL 4.1.3, o servidor mantém diversas configurações de fuso horário, algumas das quais podem ser modificadas em tempo de execução.

De seu interesse é a configuração dos fusos horários por conexão, que você usaria no início de seus scripts

SET timezone = 'Europe/London';

Quanto à detecção da configuração de fuso horário do cliente, você pode usar um pouco de JavaScript para obter e salvar essas informações em um cookie e usá-las nas leituras subsequentes da página, para calcular o fuso horário adequado.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes.
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset);

Ou você pode oferecer aos usuários a opção de definir eles próprios seus fusos horários.

Outras dicas

Armazene tudo como UTC.Você pode fazer conversões no nível do cliente ou no servidor usando as configurações do cliente.

php - data

mysql - carimbo de data / hora utc

RE a resposta de Željko Živković, descritores de fuso horário como 'Europa/Londres' só funcionam se o administrador do mySQL tiver adicionado as tabelas de fuso horário ao sistema e as mantiver atualizadas.

Caso contrário, você estará limitado a compensações numéricas como '-4:00'.Felizmente, o formato php date('P') fornece isso (a partir de 5.1.3)

Então, digamos, um arquivo de configuração de aplicativo que você possa ter

define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
    date_default_timezone_set(TZ);
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}

Isso significa que PHP e MySQL concordarão sobre qual deslocamento de fuso horário usar.

Sempre use TIMESTAMP para armazenar valores de tempo.Na verdade, a coluna é armazenada como UNIX_TIME (época), mas convertida implicitamente do deslocamento de fuso horário atual quando escrita e de volta quando lida.

Se você deseja exibir horários para usuários em outros fusos horários, em vez de uma definição global (), defina o fuso horário fornecido acima.Os valores TIMESTAMP serão convertidos automaticamente pelo MySQL no momento em que seu aplicativo vir o conjunto de resultados (o que às vezes pode ser um problema, se você também precisar saber o fuso horário original do evento, ele precisará estar em outra coluna)

e no que diz respeito a "por que não armazenar todos os horários como int's", isso faz com que você perca a capacidade de comparar e validar datas, e significa que você sempre tem que converter para a representação de data no nível do aplicativo (e é difícil para os olhos quando você olha os dados diretamente - rápido, o que aconteceu em 1254369600?)

Eu salvo todas as minhas datas como bigint devido a ter tido problemas com o tipo dateTime antes.Eu salvo o resultado da função time() do PHP nele, agora eles contam como estando no mesmo fuso horário :)

Em php, defina o fuso horário no arquivo php.ini: ini_set("date.timezone", "America/Los_Angeles");

ou em uma página específica, você pode fazer como: date_default_timezone_set("America/Los_Angeles");

No mysql você pode fazer assim: SET GLOBAL time_zone = 'America/Los_Angeles';

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top