jdk8的日期類的使用

1.關於日期和時間的基本知識

由於jdk8以前的時間日期類設計的不足,jdk8引入了java.time包來作爲新的日期時間處理類。以前的Date類,Calendar類都可以被新的api取代,新的api的大多數類都是線程安全的,加減時間返回的都是一個新的實體,不會改變原來對象的屬性。
瞭解jdk8的時間類之前,先了解下時間的基本知識。

關於時間的相關名詞 含義
GMT Greenwich Mean Time 格林尼治標準時間,十七世紀,格林威治皇家天文臺爲了海上霸權的擴張計畫而進行天體觀測。到了1884年決定以通過格林威治的子午線作爲劃分地球東西兩半球的經度零度,並以地球由西向東每24小時自轉一週360°,訂定每隔經度15°,時差1小時。而每15°的經線則稱爲該時區的中央經線,將全球劃分爲24個時區,其中包含23個整時區及180°經線左右兩側的2個半時區,東區的時間要早於西區,例如北京是東八區,東京在東九區,北京現在是下午14:00,那東京就是下午15:00
UTC Coordinated Universal Time 世界協調時間,比GMT更加精準,但功能和精度基本差不多
ISO ISO 8601是日期和時間的表示方法,即用字母和符號表示日期和時間
時間戳 從1970-01-01 00:00:00與現在所差的秒數,這裏的差值表示的倫敦時間的差值,換算到本地時,會加上本地的偏移量的秒數。

2.jdk8日期時間的使用

2.1 Instant類

保存紀元時間的秒數和毫微秒,可以通過獲取毫秒數和Date互相轉換

Instant instant = Instant.now();
Date date = new Date(instant.toEpochMilli());

2.2 LocalDateTime

只記錄了日期和時間,沒有存貯時區信息,如果只想獲取日期可以使用LocalDate,只想獲取時間可以指定LocalTime
所以LocalDateTime轉Instant要指定ZoneOffset(偏移量),同時提供了加減日期和時間的相關方法

LocalDateTime dateTime = LocalDateTime.now();

在這裏插入圖片描述

2.3 ZoneId/ZoneOffSet

ZoneId/ZoneOffSet的區別。
ZoneOffSet只處理與標準時的時區差,ZoneId除了處理與標準時的時間差,還處理地區時(夏令時,冬令時等時間調整)
支持傳統的多種方式創建時區實例

ZoneId.of("Asia/Shanghai");
ZoneId.of("+08:00");
ZoneOffset.of("+08:00");

2.4 ZoneDateTime

保存了時區的信息的日期和時間類,由於保存了時區信息,所以轉換成Instant不需要提供時區偏移類。

Instant instant = ZonedDateTime.now().toInstant();

在這裏插入圖片描述

2.5 日期時間格式化類 DateTimeFormatter

DateTimeFormatter類功能和SimpleDateFormat功能類似,不過DateTimeFormatter是線程安全的。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime parseDateTime = LocalDateTime.parse("2019-01-01 00:00:00",formatter);
System.out.println(parseDateTime);

2.6 Period,Duration 日期時間比較類

Period可以比較日期,Duration可以比較時間

總結

jdk的版本迭代還是挺快的,在升級jdk版本之後,原先一些不再被推薦使用的api,不應該繼續在新的項目和代碼中繼續使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章