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
替換GregorianCalendar
Instant
替換java.util.Date
LocalDate
替換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.Date
Instant
我們可以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.Date
LocalDate
普通日期對象
沒有什么比任何其他日期時間類更“正?!?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"));
添加回答
舉報