Java日期時間API系列9-----Jdk8中java.time包中的新的日期時間API類的Period和Duration的區別

1.Period

final修飾,線程安全,ISO-8601日曆系統中基於日期的時間量,例如2年3個月4天。express

主要屬性:年數,月數,天數。安全

    /**
     * The number of years.
     */
    private final int years;
    /**
     * The number of months.
     */
    private final int months;
    /**
     * The number of days.
     */
    private final int days;

用於時間量,比較2個日期。spa

例如:線程

     LocalDate localDate1 = LocalDate.of(2019, 11, 15);
        LocalDate localDate2 = LocalDate.of(2020, 1, 1);
        Period p = Period.between(localDate1, localDate2);
        System.out.println("years:"+p.getYears()+" months:"+p.getMonths()+" days:"+p.getDays());

輸出:code

years:0 months:1 days:17blog

2.Duration

final修飾,線程安全,基於時間的時間量,如「34.5秒」。接口

主要屬性:秒,納秒get

    /**
     * The number of seconds in the duration.
     */
    private final long seconds;
    /**
     * The number of nanoseconds in the duration, expressed as a fraction of the
     * number of seconds. This is always positive, and never exceeds 999,999,999.
     */
    private final int nanos;

用於時間量,比較2個時間。it

例如:io

        LocalDateTime localDateTime1 = LocalDateTime.of(2019, 11, 15, 0, 0);
        LocalDateTime localDateTime2 = LocalDateTime.of(2019, 11, 15, 10, 30);
        Duration d = Duration.between(localDateTime1, localDateTime2);
        System.out.println("days:"+d.toDays());
        System.out.println("hours:"+d.toHours());
        System.out.println("minutes:"+d.toMinutes());
        System.out.println("millis:"+d.toMillis());

輸出:

days:0
hours:10
minutes:630
millis:37800000

3.Period和Duration的區別

(1)包含屬性不一樣

Period包含年數,月數,天數,而Duration只包含秒,納秒。

Period只能返回年數,月數,天數;Duration能夠返回天數,小時數,分鐘數,毫秒數等。

(2)between方法能夠使用的類型不一樣

Period只能使用LocalDate,Duration能夠使用全部包含了time部分且實現了Temporal接口的類,好比LocalDateTime,LocalTime和Instant等。

Period:

public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)

 

Duration:

public static Duration between(Temporal startInclusive, Temporal endExclusive)

 

(3)between獲取天數差的區別

經過上面的實例能夠看出:

Period  p.getDays()  獲取天數時,只會獲取days屬性值,而不會將年月部分都計算整天數,不會有2020.1.1和2019.1.1比較後獲取天數爲365天的狀況。

    public int getDays() {
        return days;
    }

 

Duration d.toDays()  獲取天數時,會將秒屬性轉換整天數。

    public long toDays() {
        return seconds / SECONDS_PER_DAY;
    }

 

因此,想要獲取2個時間的相差總天數,只能用Duration。

(4)Period有獲取總月數的方法,爲何沒有獲取總天數方法?

Period有獲取總月數的方法:

    public long toTotalMonths() {
        return years * 12L + months;  // no overflow
    }

爲何沒有獲取總天數方法?

由於between後獲取到的Period,不會記錄2個日期中間的閏年信息,有閏年的存在,每一年的天數不必定是365天,因此計算不許確。

相關文章
相關標籤/搜索