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 tidakend
ke zona waktu yang sama. Sejakdf1
adalah hal yang mengubah tanggal dari format manusia, informasi zona waktu itulah yang digunakan.
Semangat!