Armazenando data / hora como UTC no banco de dados
Estou armazenando datas / horas no banco de dados como UTC e as computando dentro do meu aplicativo de volta à hora local com base no fuso horário específico. Digamos, por exemplo, que eu tenho a seguinte data / hora:
01/04/2010 00:00
Digamos que seja para um país, por exemplo Reino Unido, que observa o horário de verão (DST) e, neste momento específico, estamos no horário de verão. Quando converto essa data para UTC e a armazeno no banco de dados, ele é realmente armazenado como:
31/03/2010 23:00
Como a data seria ajustada -1 hora para o horário de verão. Isso funciona bem quando você observa o horário de verão no momento do envio. No entanto, o que acontece quando o relógio é ajustado novamente? Quando eu pego essa data do banco de dados e a converto para a hora local, esse horário específico seria visto como31/03/2009 23:00
quando, na realidade, foi processado como01/04/2010 00:00
.
Corrija-me se eu estiver errado, mas isso não é um pouco de falha ao armazenar horários como UTC?
Exemplo de conversão de fuso horário
Basicamente, o que estou fazendo é armazenar a data / hora em que as informações estão sendo enviadas ao meu sistema para permitir que os usuários façam umaalcance relatório. Aqui está como eu estou armazenando a data / hora:
public DateTime LocalDateTime(string timeZoneId)
{
var tzi = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi).ToUniversalTime().ToLocalTime();
}
Armazenando como UTC:
var localDateTime = LocalDateTime("AUS Eastern Standard Time");
WriteToDB(localDateTime.ToUniversalTime());