Jawaban singkatnya adalah:
- tambahkan "default-time-zone=utc" ke my.cnf
- dalam kode Anda, selalu "berpikir" dalam UTC, kecuali saat menampilkan tanggal untuk pengguna Anda
-
saat mendapatkan/menyetel tanggal atau stempel waktu dengan JDBC, selalu gunakan parameter Kalender, setel ke UTC:
resultset.getTimestamp("tanggal_saya", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- baik menyinkronkan server Anda dengan NTP, atau hanya mengandalkan server database untuk memberi tahu Anda jam berapa sekarang.
Jawaban panjangnya adalah ini:
Saat berurusan dengan tanggal dan zona waktu di basis data apa pun dan dengan kode klien apa pun, saya biasanya merekomendasikan kebijakan berikut:
-
Konfigurasikan database Anda untuk menggunakan zona waktu UTC , daripada menggunakan zona waktu lokal server (kecuali UTC tentunya).
-
Bagaimana melakukannya tergantung pada server database Anda. Instruksi untuk MySQL dapat ditemukan di sini:http:/ /dev.mysql.com/doc/refman/5.0/en/time-zone-support.html . Pada dasarnya Anda perlu menulis ini di my.cnf:default-time-zone=utc
-
Dengan cara ini Anda dapat meng-host server database Anda di mana saja, mengubah lokasi hosting Anda dengan mudah, dan secara lebih umum memanipulasi tanggal di server Anda tanpa ambiguitas.
- Jika Anda benar-benar lebih suka menggunakan zona waktu lokal, saya sarankan setidaknya mematikan Waktu Musim Panas, karena memiliki tanggal yang ambigu dalam database Anda bisa menjadi mimpi buruk yang nyata.
- Misalnya, jika Anda sedang membangun layanan telepon dan Anda menggunakan Daylight Saving Time di server database Anda, maka Anda menanyakan masalah:tidak akan ada cara untuk mengetahui apakah pelanggan yang menelepon dari "2008- 10-26 02:30:00" to "2008-10-26 02:35:00" sebenarnya dipanggil selama 5 menit atau selama 1 jam 5 menit (seandainya Daylight Saving terjadi pada 26 Oktober pukul 3 pagi)!
-
-
Di dalam kode aplikasi Anda, selalu gunakan tanggal UTC, kecuali saat menampilkan tanggal kepada pengguna Anda.
- Di Java, saat membaca dari database, selalu gunakan:
Timestamp myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
- Jika Anda tidak melakukan ini, stempel waktu akan dianggap berada di Zona Waktu lokal Anda, bukan UTC.
-
Sinkronkan server Anda atau hanya mengandalkan waktu server database
-
Jika Anda memiliki server Web Anda di satu server (atau lebih) dan server database Anda di beberapa server lain, maka saya sangat menyarankan Anda menyinkronkan jam mereka dengan NTP.
-
ATAU, hanya mengandalkan satu server untuk memberi tahu Anda jam berapa sekarang. Biasanya, server database adalah yang terbaik untuk meminta waktu. Dengan kata lain, hindari kode seperti ini:
readyStatement =connection.prepareStatement("UPDATE my_table SET my_time =? WHERE [...]");
java.util.Date now =new java.util.Date(); // waktu lokal! :-(
preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
int result =persiapanStatement.execute();- Sebaliknya, andalkan waktu server database:
readyStatement =connection.prepareStatement("UPDATE my_table SET my_time =SEKARANG() WHERE [...]");
int result =prepareStatement.execute(); -
Semoga ini membantu! :-)