Qual é a melhor maneira de lidar com diferentes fusos horários?

9

Estou trabalhando em um aplicativo da Web onde haverá muitos usuários diferentes de todo o mundo fazendo atualizações. Gostaria de saber qual seria a melhor maneira de lidar com fusos horários? Idealmente, quando um evento acontece, todos os usuários o veem usando seus horários locais.

O horário do sistema operacional do servidor deve ser definido como GMT, horário do local físico ou horário do meu local de desenvolvimento?

A lógica do aplicativo (PHP) e o banco de dados (MySQL) devem ser configurados para armazenar dados como GMT ou hora local (local para os usuários)?

Existe um padrão da indústria ou mesmo uma solução simples / óbvia que simplesmente não estou vendo?

Thomas Hunter
fonte

Respostas:

4

Salve seus eventos no formato TIMESTAMP do MySQL - ele é armazenado internamente como UTC, independentemente do fuso horário do servidor / usuário. Dessa forma, os dados são portáveis, independentemente da configuração específica do seu servidor. Se você armazená-lo em qualquer fuso horário específico, terá muito mais trabalho convertendo-o em fusos horários diferentes.

Busque-o do banco de dados em um registro de data e hora numérico (usando a função UNIX_TIMESTAMP ()) para uso com as várias funções de data / hora do PHP (como date ()).

Você precisa definir para cada usuário o fuso horário do PHP usando date_default_timezone_set () - você pode obter essas informações por meio de configurações configuráveis ​​pelo usuário ou pelos cabeçalhos do navegador (menos precisos). Você pode usar as funções de data / hora do PHP como faria normalmente, e a saída estará no fuso horário do usuário.

Outra alternativa é mostrar o tempo relativo (por exemplo: "5 horas e 2 minutos atrás").

Eran Galperin
fonte
5
Esteja ciente de que o (MySQL-) timestamptem um intervalo limitado de 1970-01-01 00:00:01 UTCaté 2038-01-19 03:14:07 UTC, o que, por exemplo, não permite armazenar datas de nascimento (pelo menos não para pessoas com mais de 40 anos). De fato, timestampé a solução menos adequada para armazenar registros de data e hora. Use um datetimecampo e armazene tudo como UTC.
Fee28
7

Eu usaria a hora UTC no banco de dados e os clientes a converteriam na hora local quando necessário

Rachel
fonte
UTC = GMT. Estou acostumado com o SQL Server
Rachel
9
UTC! = GMT. O UTC compensa a crescente duração do ano causada pela desaceleração da rotação da Terra, enquanto o GMT não. Embora na prática os termos sejam trocados, é bom saber a diferença. pt.wikipedia.org/wiki/Utc
1
@DeveloperArt: Será que não percebem que, graças :)
Rachel