Ini adalah masalah yang sulit dan penting. Yang benar adalah bahwa tidak ada standar yang sepenuhnya memuaskan untuk waktu yang bertahan lama. Sebagai contoh, standar SQL dan format ISO (ISO 8601) jelas tidak cukup.
Dari sudut pandang konseptual, orang biasanya berurusan dengan dua jenis data tanggal-waktu, dan lebih mudah untuk membedakannya (standar di atas tidak): " waktu fisik " dan " waktu sipil ".
Instan waktu "fisik" adalah titik dalam garis waktu universal berkesinambungan yang dihadapi fisika (tentu saja, mengabaikan relativitas). Konsep ini dapat dikodekan secara memadai dalam UTC, misalnya (jika Anda dapat mengabaikan detik kabisat).
Waktu "sipil" adalah spesifikasi waktu pakai yang mengikuti norma sipil: titik waktu di sini ditentukan sepenuhnya oleh seperangkat bidang waktu pakai (Y, M, D, H, MM, S, FS) ditambah TZ (spesifikasi zona waktu) (juga "kalender", sebenarnya; tetapi mari kita asumsikan kita membatasi diskusi untuk kalender Gregorian). Zona waktu dan kalender secara bersama memungkinkan (pada prinsipnya) untuk memetakan dari satu representasi ke yang lain. Tetapi contoh waktu sipil dan fisik pada dasarnya berbeda jenis besarnya, dan mereka harus disimpan secara konseptual dipisahkan dan diperlakukan secara berbeda (analogi: array byte dan string karakter).
Masalahnya membingungkan karena kita berbicara tentang peristiwa semacam ini secara bergantian, dan karena masa sipil dapat berubah secara politik. Masalahnya (dan kebutuhan untuk membedakan konsep-konsep ini) menjadi lebih jelas untuk peristiwa di masa depan. Contoh (diambil dari diskusi saya di sini .
John mencatat dalam kalendernya pengingat untuk beberapa acara pada waktu tayang
2019-Jul-27, 10:30:00
, TZ = Chile/Santiago
, (yang telah mengimbangi GMT-4, maka itu sesuai dengan UTC 2019-Jul-27 14:30:00
). Tetapi suatu hari di masa depan, negara memutuskan untuk mengubah TZ offset ke GMT-5.
Sekarang, ketika hari itu tiba ... jika pengingat itu memicu
A) 2019-Jul-27 10:30:00 Chile/Santiago
= UTC time 2019-Jul-27 15:30:00
?
atau
B) 2019-Jul-27 9:30:00 Chile/Santiago
= UTC time 2019-Jul-27 14:30:00
?
Tidak ada jawaban yang benar, kecuali ada yang tahu apa yang dimaksud secara konseptual John ketika ia mengatakan pada kalender "Tolong telepon saya di 2019-Jul-27, 10:30:00
TZ=Chile/Santiago
".
Apakah maksudnya "waktu kencan sipil" ("ketika jam di kota saya memberi tahu pukul 10:30")? Dalam hal itu, A) adalah jawaban yang benar.
Atau apakah yang dia maksudkan adalah "instan fisik waktu", sebuah titik dalam garis waktu alam semesta kita, katakan, "ketika gerhana matahari berikutnya terjadi". Dalam hal itu, jawaban B) adalah yang benar.
Beberapa Date / Time API mendapatkan pembedaan ini dengan benar: di antaranya, Jodatime , yang merupakan fondasi Java DateTime API (ketiga!) Berikutnya (ketiga!).
GETDATE()
pada SQL akan menjadi UTC (seperti yang akanDateTime.Now
). Dan server tidak akan terpengaruh oleh perubahan DST otomatis apa pun.