使用對象,而不是字符串
不要使用字符串從數據庫數據傳遞到/。使用對象。這是JDBC的目的,用於將數據庫的數據類型轉換爲Java的數據類型(類)。
使用java.time,而不是傳統的類
,因爲他們是出了名麻煩的,混亂的,和有缺陷,不要使用舊日期,時間類,如java.util.Date
。現在遺留下來,代之以java.time類。
Date對象在使用toString時如何知道選擇哪種格式?
toString
使用的格式是硬編碼的,未選中。你總是從該方法獲得相同的格式。格式選擇不佳,而現代圖書館和協議使用標準的ISO 8601格式。
java.time.Date
中很多糟糕的設計選擇之一是toString
方法將JVM的當前默認時區應用於實際爲UTC的值的行爲。這產生了實際上並不存在的時區幻覺。
更好地避免這些字符串。在Java和數據庫之間傳遞和獲取對象而不是字符串。請致電PreparedStatement::setObject
和ResultSet::getObject
方法與LocalDate
,Instant
和其他此類java.time對象一起使用。
LocalDate ld = myResultSet.getObject(…);
如果JDBC driver尚不符合JDBC 4.2,並不能直接處理Java。時間對象,使用java.sql類型簡要回顧一下。通過調用添加到舊類的新方法立即將這些java.sql對象轉換爲java.time對象。
java.sql.Date myJavaSqlDate = myResultSet.getDate(…);
java.time.LocalDate ld = myJavaSqlDate.toLocalDate();
如何控制新的Date對象,它應該只佔一個日期(即,沒有時間部分日)擺在首位?
將LocalDate
類用於沒有時間和時區的僅限日期的值。這映射到等效的SQL標準DATE
類型。您應該使用僅限日期的類型來定義數據庫中的列。
什麼是最佳做法來比較從數據庫中加載它之前和之後的對象之間的單元測試中持久對象的日期?
的LocalDate
類提供的方法進行比較,如compareTo
,isAfter
,isBefore
和isEqual
。其他類是相似的。
這已全部覆蓋了許多次Stack Exchange。請搜索類名稱,例如LocalDate
,Instant
,OffsetDateTime
,ZonedDateTime
,ZoneId
和java.sql.Timestamp
。
我不使用字符串來保存日期,我堅持Date對象。我編輯了我的帖子,使其更清晰。在不同的地方使用toString方法,比如在你的IDE中編輯時間和結果對我來說都是不可思議的。現在我有了更好的理解。並感謝給我關於將JDBC Sql Date轉換爲Java 8 LocalDate的提示。看起來我的老司機不支持它。目前的一個,我會用它! – Wombat