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

Tanggal Java dan zona waktu stempel waktu MySQL

tl;dr

myPreparedStatement
.setObject(  
    … ,                                   // Specify which placeholder `?` in your SQL statement. 
    OffsetDateTime.now( ZoneOffset.UTC )  // Capture the current moment as seen in the wall-clock time of UTC (an offset-from-UTC of zero).
) ;

Hindari kelas tanggal-waktu lama

Anda menggunakan kelas tanggal-waktu yang mengerikan yang digantikan bertahun-tahun yang lalu oleh java.time kelas.

Jangan pernah menggunakan Date atau Timestamp .

UTC

Abadikan momen saat ini, dalam UTC. Sebagian besar basis data menyimpan momen dalam UTC. Dan umumnya Anda harus melakukan sebagian besar logika bisnis, debugging, logging, penyimpanan, dan pertukaran data di UTC.

OffsetDateTime

Mewakili momen dengan offset-from-UTC menggunakan OffsetDateTime yang bernama tepat kelas.

Kami ingin UTC itu sendiri, atau offset nol. Kita dapat menggunakan konstanta untuk itu, ZoneOffset.UTC .

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ) ;

JDBC 4.2

Mulai JDBC 4.2 kita bisa langsung menukar java.time objek dengan database.

Untuk menyimpan momen ini ke kolom tipe data yang mirip dengan TIMESTAMP WITH TIME ZONE standar SQL :

myPreparedStatement.setObject( … , odt ) ;

Pengambilan:

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

ZonedDateTime

Untuk menyajikan momen yang diambil ini kepada pengguna, Anda mungkin ingin menyesuaikan dengan zona waktu yang diharapkan/diinginkan pengguna.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

Jangan pernah mengandalkan zona waktu default

Perhatikan pada kode di atas bahwa kami selalu menentukan offset atau zona yang diinginkan/diharapkan.

Jika Anda tidak menentukan, offset atau zona diterapkan secara implisit secara diam-diam. Lebih baik tentukan niat Anda secara eksplisit karena default JVM, database, dan OS host Anda saat ini berada di luar kendali Anda sebagai seorang programmer. Yang berarti kode yang mengandalkan default akan bervariasi dalam perilaku saat runtime.

Java 6 &7

Orang yang sama, Stephen Colebourne, yang memimpin JSR 310 dan java.time implementasi, serta Joda-Time yang terkenal proyek, juga memimpin proyek lain, ThreeTen-Backport . Sebagian besar java.time fungsionalitas di-porting kembali ke Java 6 &7 di perpustakaan ini, dengan API yang hampir identik.

Jadi lakukan semua pekerjaan Anda di kelas back-port. Kemudian, pada saat terakhir, konversikan ke/dari java.sql.Timestamp melalui DateTimeUtils kelas.

Metode konversi tersebut kebanyakan menggunakan Instant objek. Sebuah Instant adalah momen di UTC, selalu di UTC. Anda dapat menyesuaikan dari OffsetDateTime ke UTC dengan mengekstrak Instant . Instant class adalah kelas blok pembangun dasar di java.time , dengan OffsetDateDate memiliki lebih banyak fleksibilitas seperti pola pemformatan alternatif saat membuat string. Tapi keduanya Instant dan OffsetDateTime mewakili momen, titik pada timeline.

Instant instant = odt.toInstant() ;  
java.sql.Timestamp ts = org.threeten.bp.DateTimeUtils.toSqlTimestamp( instant ) ;

Pergi ke arah lain, mengambil Timestamp dari database Anda, lalu segera mengonversi ke Instant .

java.sql.Timestamp ts = myResultSet.getTimestamp( … ) ;
Instant instant = org.threeten.bp.DateTimeUtils.toInstant( ts ) ;

Tentang java.time

java.time framework dibangun ke dalam Java 8 dan yang lebih baru. Kelas-kelas ini menggantikan warisan lama yang merepotkan kelas tanggal-waktu seperti java.util.Date , Calendar , &SimpleDateFormat .

Joda-Time proyek, sekarang dalam mode pemeliharaan , menyarankan migrasi ke java.time kelas.

Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .

Anda dapat menukar java.time objek langsung dengan database Anda. Gunakan driver JDBC sesuai dengan JDBC 4.2 atau nanti. Tidak perlu string, tidak perlu java.sql.* kelas.

Di mana mendapatkan kelas Java.time?

ThreeTen-Extra proyek memperluas Java.time dengan kelas tambahan. Proyek ini adalah tempat pembuktian untuk kemungkinan penambahan Java.time di masa mendatang. Anda mungkin menemukan beberapa kelas yang berguna di sini seperti Interval , YearWeek , YearQuarter , dan lainnya .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemicu MySQL mendapatkan kueri saat ini yang menyebabkan pemicu menyala

  2. Dapatkan posting WP berdasarkan beberapa pasangan kunci/nilai meta menggunakan IN

  3. Bagaimana kategori dan subkategori untuk WooCommerce disimpan di DB?

  4. Tambahkan kolom demi kolom lainnya

  5. Mungkinkah menghapus semuanya setelah 'spasi' di bidang MySQL?