亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java.sql.date 存儲以前的日期而不是給定日期

Java.sql.date 存儲以前的日期而不是給定日期

三國紛爭 2023-04-13 17:22:04
我正在嘗試將 2019-07-27 存儲在 sql DB 中,但它存儲了 2019-07-26。誰能幫我解決這個問題。我在這里使用 Java.sql.Date。我還嘗試使用 Java.util.Date 和 Java.sql.Timestamp,結果都相同。
查看完整描述

3 回答

?
慕田峪4524236

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 ) ;


查看完整回答
反對 回復 2023-04-13
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

查看 JVM 和數據庫的時區。并查看有關用于創建 java.sql.Date 對象的方法的文檔。

構造函數的 JavaDocjava.sql.Date(long date)狀態(強調我的):

使用給定的毫秒時間值構造 Date 對象。如果給定的毫秒值包含時間信息,則驅動程序會將時間組件設置為默認時區(運行應用程序的 Java 虛擬機的時區)中對應于零 GMT 的時間。

換句話說,如果您將時間設置為您所在時區的午夜,構造函數會將其設置為同一日期的格林威治標準時間午夜。但格林威治標準時間午夜可能是您所在時區的另一天。

這是我在沒有看到任何代碼和有關所用數據庫的任何信息的情況下可以給出的最佳答案......


查看完整回答
反對 回復 2023-04-13
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

有兩個機會:

  1. 如果您的數據庫和應用程序服務器處于不同時區,請嘗試根據時差調整一天中的時間。

  2. 這發生在 LEAP 年。在這種情況下,將日期和時間保存為 12:00 而不是 0:00。

long hours = 12L * 60L * 60L * 1000L;
Date d = new Date(d1.getTime() + hours);


查看完整回答
反對 回復 2023-04-13
  • 3 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號