Esta é uma questão importante e surpreendentemente difícil. A verdade é que não existe um padrão completamente satisfatório para o tempo persistente. Por exemplo, o padrão SQL e o formato ISO (ISO 8601) claramente não são suficientes.
Do ponto de vista conceitual, geralmente se lida com dois tipos de dados de data e hora, e é conveniente distingui-los (os padrões acima não o fazem): " tempo físico " e " tempo civil ".
Um instante "físico" do tempo é um ponto na linha do tempo universal contínua com a qual a física lida (ignorando a relatividade, é claro). Este conceito pode ser adequadamente codificado - persistido no UTC, por exemplo (se você pode ignorar os segundos bissextos).
Um horário "civil" é uma especificação de data e hora que segue normas civis: um ponto de tempo aqui é totalmente especificado por um conjunto de campos de data e hora (Y, M, D, H, MM, S, FS) mais um TZ (especificação de fuso horário) (também um "calendário", na verdade; mas vamos supor que restringimos a discussão ao calendário gregoriano). Um fuso horário e um calendário permitem conjuntamente (em princípio) mapear de uma representação para outra. Mas os instantes de tempo civil e físico são tipos de magnitudes fundamentalmente diferentes e devem ser mantidos conceitualmente separados e tratados de maneira diferente (uma analogia: matrizes de bytes e cadeias de caracteres).
A questão é confusa porque falamos desses eventos de forma intercambiável e porque os tempos civis estão sujeitos a mudanças políticas. O problema (e a necessidade de distinguir esses conceitos) se torna mais evidente para eventos no futuro. Exemplo (retirado da minha discussão aqui .
John registra em seu calendário um lembrete para algum evento na data 2019-Jul-27, 10:30:00
e hora
, TZ = Chile/Santiago
, (que compensou GMT-4, portanto, corresponde ao UTC 2019-Jul-27 14:30:00
). Mas, algum dia no futuro, o país decide alterar a compensação da TZ para GMT-5.
Agora, quando chegar o dia ... esse lembrete deve ser acionado às
A) 2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
ou
B) 2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
Não existe uma resposta correta, a menos que se saiba o que John conceitualmente quis dizer quando disse ao calendário "Por favor, ligue-me para 2019-Jul-27, 10:30:00
TZ=Chile/Santiago
".
Ele quis dizer "data civil" ("quando os relógios da minha cidade marcam 10:30")? Nesse caso, A) é a resposta correta.
Ou ele quis dizer um "instante físico do tempo", um ponto na linha contínua de tempo do nosso universo, por exemplo, "quando o próximo eclipse solar acontecer". Nesse caso, a resposta B) é a correta.
Algumas APIs de Data / Hora acertam essa distinção: entre elas, Jodatime , que é a base da próxima (terceira!) API Java DateTime (JSR 310).
GETDATE()
no SQL será UTC (como seráDateTime.Now
). E o servidor não será afetado por nenhum tipo de alteração automática do horário de verão.