1.?java.util.Date
(已過時,不推薦新代碼使用)
特點
-
表示時間戳:存儲自?1970-01-01 00:00:00 UTC(Unix 紀元)?以來的毫秒數。
-
問題:
-
不區分日期和時間,也沒有時區支持(依賴系統默認時區)。
-
可變性(非線程安全)。
-
API 設計差(大部分方法已廢棄,如?
getYear()
?返回的是?year - 1900
)。
-
示例
Date date = new Date(); // 當前時間(包含毫秒)
System.out.println(date); // 輸出:Thu Jun 06 18:30:45 CST 2024
2.?java.time.LocalDateTime
(Java 8+ 推薦)
特點
-
不可變且線程安全,屬于現代日期時間 API(
java.time
?包)。 -
無時區信息,僅表示本地日期時間(如?
2024-06-06T18:30:45
)。 -
支持精確到納秒,并提供豐富的操作方法(如?
plusDays()
、isBefore()
)。
示例
LocalDateTime now = LocalDateTime.now(); // 當前本地時間
System.out.println(now); // 輸出:2024-06-06T18:30:45.123456789
3.?javax.xml.datatype.XMLGregorianCalendar
(XML 交互專用)
特點
-
專為 XML 序列化設計(如 SOAP/WSDL、XSD 的?
xs:dateTime
?類型)。 -
可表示時區(比?
LocalDateTime
?更靈活)。 -
底層依賴?
GregorianCalendar
,支持任意精度(年、月、日、時、分、秒、毫秒等)。
示例
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar("2024-06-06T18:30:45+08:00");
System.out.println(xmlDate); // 輸出:2024-06-06T18:30:45+08:00
4.?String
(純文本表示)
特點
-
無內置日期時間邏輯,僅作為格式化后的文本(如?
"2024-06-06 18:30:45"
)。 -
需手動解析/格式化(易出錯,推薦用?
DateTimeFormatter
?處理)。
示例
String dateStr = "2024-06-06T18:30:45";
LocalDateTime parsedDate = LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
對比總結
特性 | Date | LocalDateTime | XMLGregorianCalendar | String |
---|---|---|---|---|
設計目的 | 舊版時間戳 | 本地日期時間(無時區) | XML/WSDL 交互 | 純文本 |
時區支持 | 依賴系統默認 | 無 | 支持 | 無 |
可變性 | 可變(非線程安全) | 不可變(線程安全) | 不可變 | 不可變 |
精度 | 毫秒 | 納秒 | 任意精度 | 依賴格式 |
推薦使用場景 | 遺留代碼 | 現代 Java 應用 | XML/WebService | 顯示或簡單存儲 |
如何選擇?
-
新代碼優先用?
LocalDateTime
(Java 8+ 標準,清晰易用)。 -
XML/SOAP 交互用?
XMLGregorianCalendar
(與 XSD?xs:dateTime
?兼容)。 -
避免直接使用?
Date
(除非維護舊系統)。 -
String
?僅用于顯示或簡單存儲,解析時需配合?DateTimeFormatter
。
轉換示例
LocalDateTime
???XMLGregorianCalendar
// LocalDateTime → XMLGregorianCalendar
LocalDateTime ldt = LocalDateTime.now();
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(ldt.toString());// XMLGregorianCalendar → LocalDateTime
LocalDateTime fromXml = xmlDate.toGregorianCalendar().toZonedDateTime().toLocalDateTime();
Date
???LocalDateTime
// Date → LocalDateTime
Date date = new Date();
LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();// LocalDateTime → Date
Date fromLdt = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());