Saat Anda menyimpan timestamp with time zone
(timestamptz
) itu dikonversi ke UTC untuk penyimpanan di DB. Saat diambil, itu dikonversi ke zona waktu klien saat ini, bukan zona waktu awalnya. Ini adalah titik waktu, pada dasarnya.
Ada juga timestamp without time zone
(timestamp
). Ini tidak tunduk pada konversi, tetapi tidak membawa cap waktu dengan itu. Jika Anda menyimpan timestamp
dengan zona waktu klien Anda diatur ke UTC, lalu ambil ketika zona waktu klien adalah '+08:00', Anda mendapatkan nilai yang sama. Itu setengah dari yang Anda inginkan, karena mempertahankan nilai waktu mentah.
Nama dan perilakunya mengerikan dan membingungkan, tetapi ditetapkan oleh standar SQL.
Anda harus menyimpan zona waktu secara terpisah jika Anda ingin merekam titik waktu pada zona waktu tertentu. Saya akan merekomendasikan menyimpannya sebagai INTERVAL
dengan CHECK
batasan yang membatasinya menjadi colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR
. Definisi tersebut menolak -12:00 dan menerima +12:00; Saya tidak sepenuhnya yakin itu benar, jadi periksalah.
Anda dapat menyimpan timestamp
waktu lokal pada zona waktu itu (yang mungkin akan saya lakukan), atau simpan timestamptz
waktu UTC saat peristiwa terjadi ditambah offset yang memungkinkan Anda mengonversinya ke waktu lokal.
Keduanya akan berfungsi dengan baik untuk JDBC. Untuk JPA, itu akan tergantung pada seberapa baik penyedia Anda memahami dan memetakan jenis interval. Idealnya Anda menginginkan bidang yang dibuat sementara di entitas Anda yang merekonstruksi instance Kalender yang Anda inginkan menggunakan timestamp
dan interval
disimpan dalam basis data.