Bu önemli ve şaşırtıcı derecede zor bir konudur. Gerçek şu ki, kalıcı zaman için tamamen tatmin edici bir standart yoktur. Örneğin, SQL standardı ve ISO formatı (ISO 8601) açıkça yeterli değildir.
Kavramsal açıdan bakıldığında, kişi genellikle iki tür zaman-tarih verisi ile ilgilenir ve bunları ayırt etmek uygundur (yukarıdaki standartlar yoktur): " fiziksel zaman " ve " sivil zaman ".
"Fiziksel" bir zaman anı, sürekli evrensel zaman çizelgesinde fiziğin uğraştığı bir noktadır (elbette göreliliği görmezden gelmek). Bu kavram, örneğin UTC'de yeterince kodlanmış olarak kalıcı olabilir (artık saniyeleri yoksayabilirsiniz).
"Medeni" zaman, medeni normları takip eden bir tarih-saat özelliğidir: burada bir nokta, bir dizi tarih-saati alanı (Y, M, D, H, MM, S, FS) artı bir TZ (saat dilimi belirtimi) ile tam olarak belirtilir (aslında bir "takvim"; ancak tartışmayı Gregoryen takvimi ile sınırladığımızı varsayalım). Bir saat dilimi ve bir takvim (ilke olarak) bir sunumdan diğerine eşleme yapmayı sağlar. Ancak sivil ve fiziksel zaman örnekleri temelde farklı büyüklük türleridir ve kavramsal olarak ayrı tutulmalı ve farklı şekilde ele alınmalıdır (bir analoji: bayt dizileri ve karakter dizileri).
Sorun kafa karıştırıcı çünkü bu tür olaylardan birbirinin yerine geçiyor ve sivil zamanlar politik değişikliklere maruz kalıyor. Sorun (ve bu kavramları ayırt etme ihtiyacı) gelecekteki olaylar için daha belirgin hale gelmektedir. Örnek ( buradaki tartışmamdan alınmıştır .
John takviminde datetime 2019-Jul-27, 10:30:00
, TZ = Chile/Santiago
(GMT-4'ü dengeleyen, dolayısıyla UTC'ye karşılık gelen 2019-Jul-27 14:30:00
) bir olay için hatırlatma kaydeder
. Ancak gelecekte bir gün, ülke TZ ofsetini GMT-5 olarak değiştirmeye karar veriyor.
Şimdi, gün geldiğinde ... bu hatırlatıcı
A) 2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
veya
B) 2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
John'un "Lütfen beni ara" dediğinde kavramsal olarak ne anlama geldiğini bilmediği sürece doğru bir cevap yoktur 2019-Jul-27, 10:30:00
TZ=Chile/Santiago
.
"Medeni tarih-saat" ("benim şehrimdeki saatler 10:30 dediği zaman) mı demek istiyordu? Bu durumda, A) doğru cevaptır.
Yoksa "bir sonraki güneş tutulması gerçekleştiğinde", "evrenimizin sürekli zaman çizgisinde bir nokta olan" fiziksel bir anlık an "anlamına mı geliyordu. Bu durumda, cevap B) doğrudur.
Birkaç Tarih / Saat API'sı bu ayrımı doğru yapar: aralarında , bir sonraki (üçüncü!) Java DateTime API'sının (JSR 310) temeli olan Jodatime .
GETDATE()
SQL'de bu şekilde UTC (olduğu gibi) olacaktırDateTime.Now
. Ve sunucu herhangi bir otomatik DST değişikliğinden etkilenmeyecektir.