Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menyimpan java.util.Date ke dalam bidang stempel waktu MySQL di zona waktu UTC/GMT?

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:

  1. 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)!
  2. 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.
  3. 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! :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan MySQL:Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat

  2. Langkah-langkah untuk Menginstal MySQL8 di CentOS

  3. Apa pengganti uniqueidentifier di Mysql?

  4. Sintaks Pembaruan Java MySQL

  5. Pilih waktu antara dua kali mysql