Infelizmente, não há solução rápida para isso. A internacionalização de um aplicativo deve fazer parte das primeiras discussões de design, pois realmente se concentra em várias áreas diferentes, incluindo comparações de data / hora e formatação de saída.
De qualquer forma, para seguir o caminho certo, é essencial armazenar as informações de fuso horário com o tempo . Em outras palavras, perceber que a data / hora não20130407 14:50
tem sentido sem (a) incluir o deslocamento UTC atual do fuso horário (nota 1) ou (b) garantir que toda lógica que insere esses valores primeiro converta em um determinado deslocamento fixo ( provavelmente 0). Sem uma dessas coisas, dois valores de tempo são incomparáveis e os dados estão corrompidos . (O último método é brincar com fogo (nota 2) , a propósito; não faça isso.)
No SQL Server 2008+, você pode armazenar o deslocamento diretamente com o horário, usando o datetimeoffset
tipo de dados. (Para completar, em 2005 e antes, eu adicionaria uma segunda coluna para armazenar o valor de deslocamento UTC então atual (em minutos).)
Isso facilita para um aplicativo do tipo desktop, pois essas plataformas normalmente têm mecanismos para converter automaticamente uma data / hora + fuso horário em um horário local e depois formatar a saída, tudo com base nas configurações regionais do usuário.
Para a Web, que é uma arquitetura inerentemente desconectada, mesmo com os dados de back-end configurados corretamente, é mais complexo porque você precisa de informações sobre o cliente para poder fazer a conversão e / ou formatação. Isso geralmente é feito por meio das configurações de preferência do usuário (o aplicativo converte / formata as coisas antes da saída) ou simplesmente mostra as coisas com o mesmo formato fixo e deslocamento de fuso horário para todos (que é o que a plataforma Stack Exchange atualmente faz).
Você pode ver como se os dados de back-end não estiverem configurados corretamente, muito rapidamente eles ficarão complicados e invasivos. Eu não recomendaria seguir nenhum desses caminhos porque você acabará tendo mais problemas no final da linha.
Nota 1:
O deslocamento UTC de um fuso horário não é fixo: considere o horário de verão em que o deslocamento UTC de uma zona varia em mais ou menos uma hora. Também as datas de horário de verão das zonas variam regularmente. Portanto, o uso datetimeoffset
(ou um composto de local time
e UTC offset at that time
) resulta na recuperação máxima de informações.
Nota 2:
É sobre o controle de entradas de dados. Embora não exista uma maneira infalível de validar valores recebidos, é melhor impor um padrão simples que não envolva cálculos. Se uma API pública espera um tipo de dados que inclua um deslocamento, esse requisito ficará claro para o chamador.
Se não for esse o caso, o chamador deve confiar na documentação (se a ler), ou o cálculo é feito incorretamente etc. Há menos modos de falha / erro ao exigir um deslocamento, especialmente para um sistema distribuído ( ou apenas web / banco de dados em servidores separados, como o caso aqui).
Armazenar o deslocamento de qualquer maneira mata dois coelhos com uma cajadada; e mesmo se isso não for necessário agora , disponibilizará a possibilidade posteriormente, se necessário. É verdade que é preciso mais armazenamento, mas acho que vale a pena a troca, porque os dados são perdidos se nunca forem gravados.