Eu tenho um site hospedado em um fuso horário diferente dos usuários que usam o aplicativo. Além disso, os usuários podem ter um fuso horário específico. Eu queria saber como outros usuários e aplicativos de SO abordam isso? A parte mais óbvia é que, dentro do banco de dados, as datas / horas são armazenadas no UTC. Quando no servidor, todas as datas / horas devem ser tratadas no UTC. No entanto, vejo três problemas que estou tentando superar:
Obtendo a hora atual no UTC (resolvida facilmente com
DateTime.UtcNow
).Puxando data / hora do banco de dados e exibindo-as ao usuário. Há potencialmente muitas chamadas para imprimir datas em diferentes visualizações. Eu estava pensando em alguma camada entre a visualização e os controladores que poderiam resolver esse problema. Ou usando um método de extensão personalizado
DateTime
(veja abaixo). A principal desvantagem é que, em todo local do uso de data e hora em uma exibição, o método de extensão deve ser chamado!Isso também dificultaria o uso de algo como o
JsonResult
. Você não podia mais ligar facilmenteJson(myEnumerable)
, teria que serJson(myEnumerable.Select(transformAllDates))
. Talvez o AutoMapper possa ajudar nessa situação?Obtendo entrada do usuário (Local para UTC). Por exemplo, POSTAR um formulário com uma data exigiria a conversão da data para UTC antes. A primeira coisa que vem à mente é criar um costume
ModelBinder
.
Aqui estão as extensões que pensei em usar nas visualizações:
public static class DateTimeExtensions
{
public static DateTime UtcToLocal(this DateTime source,
TimeZoneInfo localTimeZone)
{
return TimeZoneInfo.ConvertTimeFromUtc(source, localTimeZone);
}
public static DateTime LocalToUtc(this DateTime source,
TimeZoneInfo localTimeZone)
{
source = DateTime.SpecifyKind(source, DateTimeKind.Unspecified);
return TimeZoneInfo.ConvertTimeToUtc(source, localTimeZone);
}
}
Eu acho que lidar com fusos horários seria algo tão comum, considerando que muitos aplicativos agora são baseados em nuvem, onde a hora local do servidor pode ser muito diferente do fuso horário esperado.
Isso já foi resolvido com elegância antes? Falta alguma coisa? Idéias e pensamentos são muito apreciados.
EDIT: Para esclarecer algumas confusões, pensei em adicionar mais alguns detalhes. O problema agora não é como armazenar os horários UTC no banco de dados, é mais sobre o processo de ir de UTC-> Local e Local-> UTC. Como o @Max Zerbini aponta, é obviamente inteligente colocar o código UTC-> Local na visualização, mas usar DateTimeExtensions
a resposta realmente? Ao obter informações do usuário, faz sentido aceitar datas como a hora local do usuário (já que isso seria o que JS usaria) e depois usar a ModelBinder
para transformar em UTC? O fuso horário do usuário é armazenado no banco de dados e é facilmente recuperado.
ModelBinder
.