Sayangnya Anda memiliki beberapa hal yang merugikan Anda:
- Driver PostgreSQL JDBC menyetel zona waktu ke zona waktu JVM Anda di sesi Postgres. Jadi, bahkan jika Server Database Anda berjalan di UTC, bidang TIMESTAMP akan dimasukkan menggunakan zona waktu JVM Anda. Saat Anda memasukkan atau meminta data, server database akan selalu menggunakan zona waktu JVM.
- Anda menggunakan TIMESTAMP bukan TIMESTAMPTZ. Deskripsi jenis ini tidak mencerminkan penggunaan sebenarnya. TIMESTAMPTZ sebenarnya berarti zona waktu agnostik. Nilai apa pun yang Anda masukkan akan disesuaikan dengan UTC menggunakan zona waktu sesi.
Karena dua masalah ini, jika Anda memiliki dua JVM yang berbeda -- satu menggunakan waktu Los Angeles dan yang lainnya menggunakan waktu New York -- setiap kali Anda menulis TIMESTAMP dengan satu JVM, itu akan menjadi "waktu UTC" yang berbeda di JVM lainnya. TIMESTAMP mengambil nilai yang disesuaikan dan hanya menggunakannya seperti yang diberikan. Jika Anda mengubah kolom TIMESTAMP Anda menjadi TIMESTAMPTZ maka waktu yang sama di kedua JVM akan selalu menjadi waktu UTC yang sama.
Jika Anda melihat ConnectionFactoryImpl#openConnectionImp Driver Postgres JDBC Anda dapat melihat di mana ia menetapkan zona waktu JVM lokal Anda sebagai zona waktu untuk zona sesi server database.
Jadi satu-satunya cara yang waras untuk menangani ini adalah dengan hanya menggunakan TIMESTAMPTZ alih-alih TIMESTAMP. Berikut beberapa informasi lebih lanjut tentang ini:
PostgreSQL/JDBC dan TIMESTAMP vs. TIMESTAMPTZ
http://justatheory.com/computers/databases/postgresql/use-timestamptz .html