2 回答
TA貢獻1821條經驗 獲得超6個贊
( (GregorianCalendar) customerSearch.get( "DateOfBirth" ) ) // Retrieve and cast object of legacy class `GregorianCalendar`.
.toZonedDateTime() // Convert from terrible legacy class to modern *java.time* class.
.toLocalDate() // Extract the date-only portion, omitting time-of-day and time zone.
java.time
您正在使用,并且可能濫用,幾年前被JSR 310 定義的java.time類所取代的糟糕的日期時間類。
ZonedDateTime替換GregorianCalendarInstant替換java.util.DateLocalDate替換java.sql.Date
如果您必須與尚未更新為java.time的舊代碼進行互操作,則可以來回轉換。調用添加到舊類的新轉換方法。
GregorianCalendar gc = customerSearch… ;ZonedDateTime zdt = gt.toZonedDateTime() ;
如果您只想要沒有時間和時區的日期,請提取LocalDate.
LocalDate dateOfBirth = zdt.toLocalDate() ;
如果Date您的意思是java.sql.Date類,則應使用上述行而不是使用LocalDate.
如果Date你的意思是java.util.Date,那將是在那里使用的錯誤類。該類代表 UTC 中的一個時刻。GregorianCalendar通過從/到 UTC的分區時刻進行調整ZonedDateTime,您可以更改日期。
轉換
如果您需要一個對象與java.timejava.util.Date尚未更新的舊代碼進行互操作,您可以轉換。A代表 UTC 中的時刻,因此我們需要java.time中的等價物,也是 UTC 中的時刻,但具有更精細的納秒分辨率而不是毫秒。java.util.DateInstant
我們可以Instant從ZonedDateTime上面看到的中提取一個。實際上,這只是從分區值調整為 UTC 值。同一時刻,時間軸上的同一點,不同的掛鐘時間。
Instant instant = zdt.toInstant() ; // Extract a `Instant`, adjusting from zone to UTC.
在舊類上使用新的轉換方法。
java.util.Date myJavaUtilDate = java.util.Date.from( instant ) ; // Beware of possible data-loss in the fractional second, truncating from nanos to millis.
如果你需要去另一個方向,從傳統到現代。
Instant instant = myJavaUtilDate.toInstant() ;
使用適當的類型
如果您嘗試表示出生日期,通常會使用沒有時間和區域的日期,然后LocalDate在您的地圖中使用。類GregorianCalendar、java.util.Date和ZonedDateTime都代表一個時刻,即時間線上的一個特定點。它們不應該僅用于日期。
該類假裝是僅日期,但通過一個糟糕的設計決策,作為子類java.sql.Date實際上確實帶有時間和偏移/區域。如上所述,此類已被替換為.java.util.DateLocalDate
普通日期對象
沒有什么比任何其他日期時間類更“正?!?code>java.util.Date的java.sql.Date了。
java.util.Date代表 UTC 中的一個時刻,始終是 UTC,盡管它設計得非常糟糕toString的方法告訴你什么(謊言)。java.time.Instant當您需要 UTC 時間時,請改用。java.sql.Date旨在表示僅日期,但正如所討論的,實際上在內部帶有時間和區域/偏移量。而是使用java.time.LocalDate來表示日期而不是時刻。GregorianCalendar表示特定地區(時區)的人們使用的掛鐘時間中看到的時刻。而是ZonedDateTime用于此目的。java.sql.Timestamp表示 UTC 中的一個時刻,但分辨率更精細,為納秒而不是毫秒。java.time中所有與時刻相關的類都使用納秒級的分辨率。因此,在 UTC 分辨率為 UTC 的情況下,請java.time.Instant使用Timestamp.
從 JDBC 4.2 開始,我們可以直接與數據庫交換java.time類。因此,無需再為您的數據庫工作而觸摸java.sql.Date或再次。java.sql.Timestamp
TA貢獻1895條經驗 獲得超3個贊
沒有 java 類GregorianDate。除非這是您自己的課程,否則您沒有提及。那么,以防萬一公歷日期只是一個常規Date的,因為今天世界上大多數人都使用公歷?那么您的地圖在您的 中包含什么類的實例HashMap<String, Object>?如果它只是一個常規Date,那么你的代碼應該是:
Date dateOfBirth = (Date)(customerSearch.get("DateOfBirth"));添加回答
舉報
