3 回答

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

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

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