Normalmente tenho um "interceptor" que antes de ler / escrever de / para o banco de dados faz a conversão DateTime (de UTC para a hora local e da hora local para UTC), para que eu possa usar DateTime.Now
(derivações e comparações) em todo o sistema sem me preocupar sobre fusos horários.
Em relação à serialização e movimentação de dados entre computadores, não há necessidade de se preocupar, pois a data e hora é sempre UTC.
Devo continuar armazenando minhas datas (SQL 2008 - datetime) no formato UTC ou, em vez disso, devo armazená-lo usando DateTimeOffset
(SQL 2008 - datetimeoffset)?
As datas UTC no banco de dados (tipo datetime) estão funcionando e são conhecidas há tanto tempo, por que alterá-las? Quais são as vantagens?
Já li artigos como este , mas não estou 100% convencido. Alguma ideia?
fonte
Respostas:
Há uma grande diferença, onde você não pode usar o UTC sozinho.
Se você tem um cenário como este
Então:
Mas:
Um exemplo simples é o sistema de reserva de passagem aérea ... A passagem aérea deve conter 2 horários: - horário de "decolagem" (no fuso horário da cidade "De") - horário de "pouso" (no fuso horário da cidade "Destino")
fonte
InputLocationId
(ou entidade normalizada semelhante). Haveria cálculos envolvidos (olá, exceções ... especialmente você, Indiana ), mas ainda é um processo determinístico - e então o equilíbrio da lógica de data e hora do aplicativo é direto.Você está absolutamente correto em usar o UTC para todos os tempos históricos (ou seja, eventos de registro ocorridos). Sempre é possível ir do UTC para a hora local, mas nem sempre o contrário.
Quando usar a hora local? Responda a esta pergunta:
Armazene a hora local apenas se a resposta for "sim". Obviamente, isso será apenas para datas futuras, e geralmente apenas para datas que afetem as pessoas de alguma forma.
Por que armazenar um fuso horário / deslocamento?
Em primeiro lugar, se você deseja registrar qual foi o deslocamento para o usuário que executou a ação, provavelmente seria melhor apenas fazer isso, ou seja, no login registre a localização e o fuso horário desse usuário.
Em segundo lugar, se você deseja converter para exibição, você precisa ter uma tabela de todas as transições de deslocamento de horário local para esse fuso horário, simplesmente saber o deslocamento atual não é suficiente, porque se você estiver mostrando uma data / hora de seis meses atrás, o deslocamento ser diferente.
fonte
Um DATETIMEOFFSET oferece a capacidade de armazenar a hora local e a hora UTC em um campo.
Isso permite relatórios muito simples e eficientes no horário local ou UTC, sem a necessidade de processar os dados para exibição de qualquer forma.
Esses são os dois requisitos mais comuns - hora local para relatórios locais e hora UTC para relatórios de grupo.
A hora local é armazenada na parte DATETIME de DATETIMEOFFSET e o OFFSET do UTC é armazenado na parte OFFSET, portanto a conversão é simples e, uma vez que não requer nenhum conhecimento do fuso horário de onde os dados vieram, pode ser feita no nível do banco de dados .
Se você não precisar de tempos menores que milissegundos, por exemplo, apenas minutos ou segundos, você pode usar DATETIMEOFFSET (0). O campo DATETIMEOFFSET exigirá apenas 8 bytes de armazenamento - o mesmo que DATETIME.
Usar DATETIMEOFFSET em vez de UTC DATETIME oferece mais flexibilidade, eficiência e simplicidade para relatórios.
fonte