3 回答

TA貢獻(xiàn)1875條經(jīng)驗 獲得超5個贊
時區(qū)和錯誤的類別
您未能提供足夠的信息以獲得明確的答案。
但我懷疑你的問題是由于時區(qū)造成的。這個java.sql.Date
類是一個可怕的 hack,假裝代表一個日期但實際上也隱藏了一天中的時間和時區(qū)。永遠(yuǎn)不要使用這個類。
您正在使用多年前隨著 JSR 310 的采用而被取代的可怕的日期時間類。僅使用java.time包中的類。
如果您只想存儲日期,請使用數(shù)據(jù)類型類似于SQL 標(biāo)準(zhǔn)類型的DATE
列。
LocalDate
在 Java 中,與 JDBC 4.2 或更高版本一起使用。這個類只有一個日期,沒有時間和時區(qū)。
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
寫入數(shù)據(jù)庫:
LocalDate ld = LocalDate.of( 2019 , 1 , 23 ) ; … myPreparedStatement.setObject( … , ld ) ;
要捕獲當(dāng)前日期,請指定您想要/預(yù)期的時區(qū)。對于任何給定時刻,全球各地的日期因時區(qū)而異。
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ;LocalDate ld = LocalDate.now( z ) ;

TA貢獻(xiàn)1856條經(jīng)驗 獲得超17個贊
查看 JVM 和數(shù)據(jù)庫的時區(qū)。并查看有關(guān)用于創(chuàng)建 java.sql.Date 對象的方法的文檔。
構(gòu)造函數(shù)的 JavaDocjava.sql.Date(long date)
狀態(tài)(強(qiáng)調(diào)我的):
使用給定的毫秒時間值構(gòu)造 Date 對象。如果給定的毫秒值包含時間信息,則驅(qū)動程序會將時間組件設(shè)置為默認(rèn)時區(qū)(運行應(yīng)用程序的 Java 虛擬機(jī)的時區(qū))中對應(yīng)于零 GMT 的時間。
換句話說,如果您將時間設(shè)置為您所在時區(qū)的午夜,構(gòu)造函數(shù)會將其設(shè)置為同一日期的格林威治標(biāo)準(zhǔn)時間午夜。但格林威治標(biāo)準(zhǔn)時間午夜可能是您所在時區(qū)的另一天。
這是我在沒有看到任何代碼和有關(guān)所用數(shù)據(jù)庫的任何信息的情況下可以給出的最佳答案......

TA貢獻(xiàn)1802條經(jīng)驗 獲得超5個贊
有兩個機(jī)會:
如果您的數(shù)據(jù)庫和應(yīng)用程序服務(wù)器處于不同時區(qū),請嘗試根據(jù)時差調(diào)整一天中的時間。
這發(fā)生在 LEAP 年。在這種情況下,將日期和時間保存為 12:00 而不是 0:00。
long hours = 12L * 60L * 60L * 1000L; Date d = new Date(d1.getTime() + hours);
添加回答
舉報