JDK 8 及其後續 JDK 中 Period 和 Duration
我們都知道 JDK 8 以後開始使用了新的 joda 日期處理 API。
在這個 API 中,新增了 Period 和 Duration 這 2 個類,用於計算 2 個日期之間的間隔。
下面對這 2 個類進行一些比較和說明,從使用上來說,如果你不需要秒或者納秒一級的比較的話,就用 Period ,Period 的比較粒度更粗,通常只能精確到,天(Days),月(Months)和 年(Years)。
Duration 是按照納秒級別的比較,通常會非常精確,不會丟精度,Period 有可能會丟精度。
執行緒安全和可變
這 2 個類都是:
- 執行緒安全(thread-safe)
- 不可變(immutable)
對比和區別
2 個類比較的精度不不同。
Period 包含年數,月數,天數,而 Duration 只包含秒,納秒。
Period 只能返回年數,月數,天數;Duration可以返回天數,小時數,分鐘數,毫秒數等。
2 個類可以使用的型別不同。
Period 只能使用 LocalDate,換句話說 Period 只能使用 Date 物件。
Duration 是可以使用 Instant 物件的。
例如下面的程式碼:
Instant t1, t2;
...
long ns = Duration.between(t1, t2).toNanos();
將會計算 2 個時間之間的納秒的不同。
考察下面計算生日的程式碼:
Period p = Period.between(birthday, today);
long p2 = ChronoUnit.DAYS.between(birthday, today);
System.out.println("You are " + p.getYears() + " years, " + p.getMonths() +
" months, and " + p.getDays() +
" days old. (" + p2 + " days total)");
程式碼將會輸出為:
You are 41 years, 8 months, and 0 days old. (15219 days total)
因為我們在生日和日期的計算的時候,並不需要非常高的精度,因此上面的程式碼是不是非常方便?
再也不用受到老的 Java 日期 API 的折磨了。
「其他文章」
- 到底應不應該使用 lombok
- Java 8 開始新增的 Optional 類 - Optional 物件中的返回
- Fedora 上如何安裝 gitea
- Ubuntu 安裝 NTP 服務
- 群暉(Synology)NAS 安裝 Mariadb 資料庫啟動錯誤
- 美東某 IoT 公司技術流程第一輪溝通就掛了
- Node 的 cross-env 模組
- Npm 安裝提示 EUNSUPPORTEDPROTOCOL 錯誤
- 使用 Jackson – 將字串轉換為 JsonNode 物件
- 在 Discourse 中如何使用輸入對話方塊
- IntelliJ IDEA 中如何將 POM 中的版本號快速提出為屬性
- RedHat 8 時間同步和時區修改
- JDK 8 及其後續 JDK 中 Period 和 Duration
- POM 檔案中 licenses 許可證的定義
- IntelliJ IDEA 如何顯示提交輸入的資訊歷史
- 前端工程師的 caniuse
- JavaScript 陣列進行拼接的函式
- JavaScript 陣列元素的一些操作
- 如何理解 Java 多執行緒
- JavaScript 中 Array map() 方法