JDK 8 及其後續 JDK 中 Period 和 Duration

語言: CN / TW / HK

我們都知道 JDK 8 以後開始使用了新的 joda 日期處理 API。

在這個 API 中,新增了 Period 和 Duration 這 2 個類,用於計算 2 個日期之間的間隔。

jdk-period-01

下面對這 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 的折磨了。

 

https://www.ossez.com/t/jdk-8-jdk-period-duration/13709