Questo è un problema importante e sorprendentemente difficile. La verità è che non esiste uno standard completamente soddisfacente per il tempo persistente. Ad esempio, lo standard SQL e il formato ISO (ISO 8601) non sono chiaramente sufficienti.
Dal punto di vista concettuale, di solito si tratta di due tipi di dati data-ora, ed è conveniente distinguerli (gli standard di cui sopra non lo fanno): " tempo fisico " e " tempo civile ".
Un istante "fisico" del tempo è un punto della linea temporale universale continua che la fisica affronta (ignorando la relatività, ovviamente). Questo concetto può essere adeguatamente codificato e persistente in UTC, ad esempio (se è possibile ignorare i secondi bisestili).
Un orario "civile" è una specifica datetime che segue le norme civili: un punto temporale qui è completamente specificato da un insieme di campi datetime (Y, M, D, H, MM, S, FS) più una TZ (specifica fuso orario) (anche un "calendario", in realtà; ma supponiamo che limitiamo la discussione al calendario gregoriano). Un fuso orario e un calendario consentono congiuntamente (in linea di principio) di mappare da una rappresentazione all'altra. Ma gli istanti di tempo civili e fisici sono tipi di grandezza fondamentalmente diversi e dovrebbero essere mantenuti concettualmente separati e trattati in modo diverso (un'analogia: matrici di byte e stringhe di caratteri).
La questione è confusa perché parliamo di questi tipi di eventi in modo intercambiabile e perché i tempi civili sono soggetti a cambiamenti politici. Il problema (e la necessità di distinguere questi concetti) diventa più evidente per gli eventi futuri. Esempio (tratto dalla mia discussione qui .
John registra nel suo calendario un promemoria per qualche evento al datetime
2019-Jul-27, 10:30:00
, TZ = Chile/Santiago
, (che ha offset GMT-4, quindi corrisponde a UTC 2019-Jul-27 14:30:00
). Ma un giorno in futuro, il paese decide di cambiare l'offset TZ in GMT-5.
Ora, quando verrà il giorno ... dovrebbe attivarsi quel promemoria
A) 2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
o
B) 2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
Non esiste una risposta corretta, a meno che uno non sappia cosa intendesse John concettualmente quando ha detto al calendario "Per favore, chiamami 2019-Jul-27, 10:30:00
TZ=Chile/Santiago
".
Intendeva un "appuntamento civile" ("quando gli orologi nella mia città indicano le 10:30")? In tal caso, A) è la risposta corretta.
Oppure intendeva un "istante fisico del tempo", un punto nella linea continua del tempo del nostro universo, diciamo "quando si verificherà la prossima eclissi solare". In tal caso, la risposta B) è quella corretta.
Alcune API Data / Ora ottengono questa distinzione giusta: tra queste, Jodatime , che è la base della prossima (terza!) API Java DateTime (JSR 310).
GETDATE()
su SQL sarà UTC (come lo saràDateTime.Now
). E il server non verrà influenzato da alcun tipo di modifica automatica dell'ora legale.