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

Perbedaan TimeZone di mysql dan java

Latar Belakang:Kesalahpahaman yang sangat umum - dan besar - yang dibagikan oleh programmer yang brilian sekalipun adalah gagasan bahwa stempel waktu yang tersimpan (dalam database Anda, Tanggal, Kalender, Stempel Waktu, dkk) entah bagaimana memiliki informasi zona waktu. Tidak. Sebuah cap waktu (hingga Java 8, bagaimanapun) disimpan sebagai jumlah milidetik sejak tengah malam pada 1 Jan 1970 UTC. Akhir kalimat. Satu-satunya hal yang dilakukan oleh pengaturan zona waktu adalah memberikan informasi yang cukup ke komputer untuk mengubah cap waktu itu ke format yang dapat dibaca manusia, dan sebaliknya.

Jawaban:Saat Anda menduga bahwa ini adalah masalah zona waktu, Anda benar . Tetapi kode yang Anda gunakan untuk memverifikasi ini juga bermasalah:

end.setTimeZone(TimeZone.getTimeZone("America/New York"));
pst.setTimestamp(1, new java.sql.Timestamp(end.getTimeInMillis()));

setTimeZone . itu pernyataan tidak berpengaruh pada waktu yang disimpan di end , karena waktunya sudah ditentukan. Ini hanya akan berpengaruh jika Anda menyimpan waktu setelahnya, dan hanya jika Anda menggunakan salah satu metode Kalender yang mengubah waktu dari format yang dapat dibaca manusia (dan bukan setTimeInMillis ).

Saat Anda menggunakan getTimeInMillis untuk meneruskan cap waktu ke pernyataan yang Anda siapkan, Anda mengambil cap waktu secara langsung. Karena Anda tidak mengonversinya ke format manusia, sekali lagi informasi zona waktu diabaikan.

Saat Anda mencoba

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
end.setTime(sdf.parse("2012-10-01 00:00:00"));
pst.setTimestamp(1, new java.sql.Timestamp(end.getTime()));

dan

pst.setTimestamp(1, new java.sql.Timestamp(octDate.get(Calendar.YEAR)-1900,octDate.get(Calendar.MONTH),octDate.get(Calendar.DATE),octDate.get(Calendar.HOUR),octDate.get(Calendar.MINUTE),octDate.get(Calendar.SECOND),0));
pst.setTimestamp(2, new java.sql.Timestamp(end.get(Calendar.YEAR)-1900,end.get(Calendar.MONTH),end.get(Calendar.DATE),end.get(Calendar.HOUR),end.get(Calendar.MINUTE),end.get(Calendar.SECOND),0));

hal-hal muncul berfungsi karena Anda sekarang menggunakan metode yang mengonversi ke/dari format yang dapat dibaca manusia, dan oleh karena itu informasi zona waktu yang ditentukan digunakan. Namun, ini hanya menutupi masalah sebenarnya. Masalah sebenarnya adalah waktu dikonversi dengan tidak benar ketika Anda menguraikannya dari endString . Yaitu, zona waktu yang endString dinyatakan dalam tidak sesuai dengan zona waktu yang ditetapkan dalam df1 pada saat tanggal diuraikan.

JAWABAN SINGKAT:sebelum baris ini:

end.setTime(df1.parse(endString));

Anda perlu:

  • Cari tahu zona waktu apa waktu di endString diungkapkan dalam.
  • Setel df1 dan tidak end ke zona waktu yang sama. Sejak df1 adalah hal yang mengubah tanggal dari format manusia, informasi zona waktu itulah yang digunakan.

Semangat!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. C# Eksekusi mysqlnonqueryasync tidak asinkron

  2. Ulangi penyisipan Query di PHP

  3. Prosedur Tersimpan vs Pemicu di MySQL

  4. Bagaimana cara melindungi forum saya dari spam?

  5. Kesalahan muncul dalam kode mysqli dan call_user_func_array()