最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8時間處理進階:Duration與Period深度剖析時間與日期間隔實戰(zhàn)

 更新時間:2026年04月08日 10:22:10   作者:CraigSD  
本文全面剖析Java8日期時間API中的兩大核心類——Duration和Period,從基礎(chǔ)創(chuàng)建到高級實戰(zhàn),深入講解時分秒納秒級時間間隔與年月日期間隔的精準計算方法,包含計時器、年齡計算、合同到期提醒等真實業(yè)務(wù)案例,助你徹底掌握Java8時間間隔處理技巧

1. Duration與Period:Java8的時間魔法棒

第一次接觸Java8的日期時間API時,我被LocalDate和LocalDateTime的簡潔驚艷到了。但真正讓我感受到時間魔法魅力的,是在處理兩個時間點間隔時遇到的Duration和Period。記得有次做會員系統(tǒng),需要計算用戶剩余有效期天數(shù),用老Date API寫了幾十行還容易出錯,換成Period后三行代碼搞定。

Duration和Period就像時間計算領(lǐng)域的"魔法棒":一個專注處理時分秒的精確時間間隔(Duration),一個擅長處理年月日的日期間隔(Period)。它們都實現(xiàn)了TemporalAmount接口,但分工明確:

  • Duration:處理納秒級精度的時間間隔,適合計算:
    • 程序執(zhí)行耗時(PT1.345S表示1.345秒)
    • 視頻時長(PT2H35M表示2小時35分鐘)
    • 倒計時剩余時間
  • Period:處理日歷日期間隔,適合:
    • 計算會員有效期(P1Y3M表示1年3個月)
    • 統(tǒng)計項目周期(P2Y表示2年)
    • 生成年齡描述(P25Y表示25歲)
// 典型使用場景示例
LocalDateTime 下單時間 = LocalDateTime.parse("2023-06-01T14:30:00");
LocalDateTime 發(fā)貨時間 = LocalDateTime.now();
Duration 配送耗時 = Duration.between(下單時間, 發(fā)貨時間);
System.out.println("您的訂單將在"+配送耗時.toHours()+"小時內(nèi)發(fā)貨");
LocalDate 生日 = LocalDate.of(1990, 5, 20);
Period 年齡 = Period.between(生日, LocalDate.now());
System.out.println("用戶年齡:"+年齡.getYears()+"歲");

2. Duration實戰(zhàn):精確到納秒的時間控制

2.1 核心API深度解析

Duration的底層由兩部分組成:秒數(shù)(seconds)和納秒數(shù)(nanos)。這種設(shè)計讓它既能處理人類可讀的時間單位(小時/分鐘),又能滿足科學(xué)計算需要的納秒精度。實際項目中我常用這些方法:

基礎(chǔ)轉(zhuǎn)換

Duration 通話時長 = Duration.ofMinutes(3).plusSeconds(45);
System.out.println(通話時長.toMillis()); // 輸出225000毫秒

比較判斷

Duration 標準時長 = Duration.ofHours(1);
Duration 實際時長 = Duration.between(startTime, endTime);
if(實際時長.compareTo(標準時長) > 0) {
    System.out.println("超時警告!");
}

時間加減

LocalDateTime 會議開始 = LocalDateTime.now();
Duration 提前量 = Duration.ofMinutes(15);
LocalDateTime 提醒時間 = 會議開始.minus(提前量);

2.2 避坑指南

在電商系統(tǒng)開發(fā)中,我踩過一個典型的時間計算坑:用Duration處理跨天的營業(yè)時間計算。比如計算店鋪從今天22:00到次日02:00的營業(yè)時長:

LocalTime 打烊時間 = LocalTime.of(2, 0);
Duration 營業(yè)時長 = Duration.between(LocalTime.of(22, 0), 打烊時間);
System.out.println(營業(yè)時長.toHours()); // 輸出-20!

這里應(yīng)該用Duration.between配合LocalDateTime處理跨日場景:

LocalDateTime 今日22點 = LocalDate.now().atTime(22, 0);
LocalDateTime 次日2點 = 今日22點.plusDays(1).withHour(2);
Duration 正確時長 = Duration.between(今日22點, 次日2點);

3. Period實戰(zhàn):日歷日期的藝術(shù)

3.1 年月日間隔計算

Period最強大的能力在于處理日歷日期的模糊性。比如計算"1個月"的間隔時,它能自動考慮不同月份的天數(shù)差異。在財務(wù)系統(tǒng)中計算利息時特別有用:

LocalDate 起息日 = LocalDate.of(2023, 1, 31);
LocalDate 到期日 = 起息日.plus(Period.ofMonths(1));
System.out.println(到期日); // 輸出2023-02-28(自動處理2月天數(shù))

但要注意Period.getDays()只返回天數(shù)部分,要獲取總天數(shù)應(yīng)該用ChronoUnit:

Period period = Period.between(LocalDate.now(), LocalDate.now().plusMonths(2));
System.out.println(period.getDays()); // 輸出0(因為月份變化但具體天數(shù)未設(shè)置)
long 總天數(shù) = ChronoUnit.DAYS.between(LocalDate.now(), LocalDate.now().plusMonths(2));

3.2 生日計算最佳實踐

計算年齡是Period的經(jīng)典場景,但有幾個細節(jié)要注意:

LocalDate 生日 = LocalDate.of(1990, 2, 28);
LocalDate 今天 = LocalDate.of(2023, 2, 28);
Period 年齡 = Period.between(生日, 今天);
System.out.println(年齡.getYears()); // 輸出33(正確)
System.out.println(年齡.getMonths()); // 輸出0
System.out.println(年齡.getDays()); // 輸出0
// 閏年測試
LocalDate 閏年生日 = LocalDate.of(2000, 2, 29);
Period 特殊年齡 = Period.between(閏年生日, LocalDate.of(2023, 2, 28));
System.out.println(特殊年齡.getYears()); // 輸出22(自動處理閏日)

4. 混合使用技巧與性能優(yōu)化

4.1 時間日期的組合運算

在項目管理系統(tǒng)開發(fā)中,我經(jīng)常需要同時處理日期和時間間隔。比如計算"項目周期3個月+緩沖期72小時":

LocalDate 開始日期 = LocalDate.now();
Period 項目周期 = Period.ofMonths(3);
Duration 緩沖期 = Duration.ofHours(72);
LocalDateTime 計劃完成時間 = 開始日期
    .plus(項目周期)
    .atStartOfDay()
    .plus(緩沖期);

4.2 性能考量

雖然Duration/Period的易用性很棒,但在高頻調(diào)用的場景需要注意:

避免重復(fù)創(chuàng)建:對于固定時長(如超時閾值),應(yīng)該靜態(tài)化

private static final Duration TIMEOUT = Duration.ofSeconds(30);

選擇合適精度:只需要秒級精度時,不要用納秒

// 不好的寫法
Duration.ofNanos(1_000_000_000L); 
// 好的寫法
Duration.ofSeconds(1);

批量計算優(yōu)化:處理大量日期時,先用LocalDate做初步篩選,再精細計算

List<LocalDate> 日期列表 = // 從數(shù)據(jù)庫獲取的日期集合
LocalDate 基準日 = LocalDate.now().minusMonths(3);
// 先過濾再計算更高效
List<LocalDate> 近期日期 = 日期列表.stream()
    .filter(d -> d.isAfter(基準日))
    .collect(Collectors.toList());
// 然后計算具體間隔
Map<LocalDate, Period> 間隔映射 = 近期日期.stream()
    .collect(Collectors.toMap(
        Function.identity(),
        d -> Period.between(d, LocalDate.now())
    ));

到此這篇關(guān)于Java8時間處理進階:Duration與Period深度剖析時間與日期間隔實戰(zhàn)的文章就介紹到這了,更多相關(guān)Java8 Duration與Period時間間隔內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 細數(shù)Java接口的概念、分類及與抽象類的區(qū)別

    細數(shù)Java接口的概念、分類及與抽象類的區(qū)別

    下面小編就為大家?guī)硪黄殧?shù)Java接口的概念、分類及與抽象類的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 詳解springboot啟動時是如何加載配置文件application.yml文件

    詳解springboot啟動時是如何加載配置文件application.yml文件

    這篇文章主要介紹了詳解springboot啟動時是如何加載配置文件application.yml文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java讀取properties文件連接數(shù)據(jù)庫的方法示例

    Java讀取properties文件連接數(shù)據(jù)庫的方法示例

    這篇文章主要介紹了Java讀取properties文件連接數(shù)據(jù)庫的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • JAVA實戰(zhàn)項目實現(xiàn)客戶選購系統(tǒng)詳細流程

    JAVA實戰(zhàn)項目實現(xiàn)客戶選購系統(tǒng)詳細流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個簡單的客戶選購系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2021-10-10
  • java中Base64編碼原理實例講解

    java中Base64編碼原理實例講解

    這篇文章主要介紹了java中Base64編碼原理實例講解,文章講解的很清晰,有對于這方面不太懂的同學(xué)可以研究下
    2021-02-02
  • Java的非對稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解

    Java的非對稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解

    這篇文章主要介紹了Java的非對稱加密(RSA、數(shù)字簽名、數(shù)字證書)詳解,非對稱加密:加密、解密使用不同的兩把密鑰,這兩把密鑰成對,一般通信開始時通過非對稱加密將對稱加密的密鑰發(fā)送給另一方,然后雙方通過對稱加密來進行溝通,需要的朋友可以參考下
    2024-01-01
  • mybatis.type-aliases-package之巨坑的解決

    mybatis.type-aliases-package之巨坑的解決

    這篇文章主要介紹了mybatis.type-aliases-package之巨坑的解決,具有很好的參考價值,希望對大家有所幫助。
    2021-09-09
  • 一文詳解RabbitMQ如何保證消息可靠性

    一文詳解RabbitMQ如何保證消息可靠性

    這篇文章將詳細介紹RabbitMQ的消息可靠性機制,如消息丟失,消息重復(fù)性消費,消息積壓等問題,具有一定的參考價值,需要的朋友可以參考下
    2023-07-07
  • springboot將lib和jar分離的操作方法

    springboot將lib和jar分離的操作方法

    本文介紹了如何通過優(yōu)化pom.xml配置來減小Spring Boot項目的jar包大小,主要通過使用spring-boot-maven-plugin和maven-dependency-plugin插件,將依賴庫打包到j(luò)ar中,并通過指定外部lib路徑的方式運行jar,從而減小jar包體積,感興趣的朋友一起看看吧
    2025-02-02
  • SpringMvc獲取頁面中的參數(shù)方法詳解

    SpringMvc獲取頁面中的參數(shù)方法詳解

    這篇文章主要介紹了SpringMvc獲取頁面中的參數(shù)方法詳解,獲取頁面的參數(shù)通常都是讓類實現(xiàn)設(shè)置HttpServletRequest request接口然后重寫接口中的方法的辦法來得到參數(shù),但是在Springmvc中有其他的獲取方法,需要的朋友可以參考下
    2023-10-10

最新評論

兖州市| 同心县| 凤凰县| 昆山市| 南召县| 万安县| 龙门县| 双江| 阳东县| 玛曲县| 庄河市| 巨鹿县| 修水县| 广平县| 类乌齐县| 潍坊市| 临泉县| 永年县| 乐昌市| 鲜城| 彭阳县| 泸定县| 佛学| 崇阳县| 平潭县| 浪卡子县| 罗山县| 洪泽县| 喀喇| 泸定县| 陇西县| 开江县| 台湾省| 南宁市| 榆树市| 寻乌县| 舒城县| 常德市| 高平市| 琼中| 景德镇市|