Este es un tema importante y sorprendentemente difícil. La verdad es que no existe un estándar completamente satisfactorio para el tiempo persistente. Por ejemplo, el estándar SQL y el formato ISO (ISO 8601) claramente no son suficientes.
Desde el punto de vista conceptual, generalmente se tratan dos tipos de datos de fecha y hora, y es conveniente distinguirlos (los estándares anteriores no lo hacen): " tiempo físico " y " tiempo civil ".
Un instante de tiempo "físico" es un punto en la línea de tiempo universal continua que la física trata (ignorando la relatividad, por supuesto). Este concepto puede codificarse adecuadamente en UTC, por ejemplo (si puede ignorar los segundos bisiestos).
Un tiempo "civil" es una especificación de fecha y hora que sigue las normas civiles: un punto de tiempo aquí está completamente especificado por un conjunto de campos de fecha y hora (Y, M, D, H, MM, S, FS) más un TZ (especificación de zona horaria) (también un "calendario", en realidad; pero supongamos que restringimos la discusión al calendario gregoriano). Una zona horaria y un calendario permiten conjuntamente (en principio) mapear de una representación a otra. Pero los instantes de tiempo civil y físico son fundamentalmente diferentes tipos de magnitudes, y deben mantenerse conceptualmente separados y tratados de manera diferente (una analogía: conjuntos de bytes y cadenas de caracteres).
El tema es confuso porque hablamos de estos tipos de eventos indistintamente y porque los tiempos civiles están sujetos a cambios políticos. El problema (y la necesidad de distinguir estos conceptos) se vuelve más evidente para los eventos en el futuro. Ejemplo (tomado de mi discusión aquí .
John registra en su calendario un recordatorio para algún evento en fecha 2019-Jul-27, 10:30:00
y hora
, TZ = Chile/Santiago
, (que ha compensado GMT-4, por lo tanto, corresponde a UTC 2019-Jul-27 14:30:00
). Pero algún día en el futuro, el país decide cambiar la compensación de TZ a GMT-5.
Ahora, cuando llegue el día ... si ese recordatorio se dispara a
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
?
No hay una respuesta correcta, a menos que uno sepa a qué se refería John conceptualmente cuando le dijo al calendario "Por favor, llámame 2019-Jul-27, 10:30:00
TZ=Chile/Santiago
".
¿Se refería a una "fecha-hora civil" ("cuando los relojes de mi ciudad dan las 10:30")? En ese caso, A) es la respuesta correcta.
¿O quiso decir un "instante físico del tiempo", un punto en la línea continua de tiempo de nuestro universo, por ejemplo, "cuando ocurra el próximo eclipse solar". En ese caso, la respuesta B) es la correcta.
Algunas API de fecha / hora hacen esta distinción correcta: entre ellas, Jodatime , que es la base de la próxima (¡tercera!) API Java DateTime (JSR 310).
GETDATE()
en SQL será UTC (como lo haráDateTime.Now
). Y el servidor no se verá afectado por ningún tipo de cambio automático de horario de verano.