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

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

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

1. Duration與Period:Java8的時(shí)間魔法棒

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

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

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

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

2.1 核心API深度解析

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

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

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

比較判斷

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

時(shí)間加減

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

2.2 避坑指南

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

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

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

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

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

3.1 年月日間隔計(jì)算

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

LocalDate 起息日 = LocalDate.of(2023, 1, 31);
LocalDate 到期日 = 起息日.plus(Period.ofMonths(1));
System.out.println(到期日); // 輸出2023-02-28(自動(dòng)處理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(因?yàn)樵路葑兓唧w天數(shù)未設(shè)置)
long 總天數(shù) = ChronoUnit.DAYS.between(LocalDate.now(), LocalDate.now().plusMonths(2));

3.2 生日計(jì)算最佳實(shí)踐

計(jì)算年齡是Period的經(jīng)典場景,但有幾個(gè)細(xì)節(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(自動(dòng)處理閏日)

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

4.1 時(shí)間日期的組合運(yùn)算

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

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

4.2 性能考量

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

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

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

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

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

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

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

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

相關(guān)文章

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

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

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

    詳解springboot啟動(dòng)時(shí)是如何加載配置文件application.yml文件

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

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

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

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

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

    java中Base64編碼原理實(shí)例講解

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

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

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

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

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

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

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

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

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

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

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

最新評論

老河口市| 新乡市| 石棉县| 石门县| 蓝田县| 兴安县| 崇州市| 边坝县| 读书| 曲阳县| 巴林左旗| 兴化市| 石首市| 炎陵县| 禹城市| 肥东县| 望奎县| 肇东市| 睢宁县| 凉城县| 浪卡子县| 门头沟区| 沧州市| 福贡县| 德化县| 莎车县| 洪江市| 广平县| 蓬溪县| 鸡东县| 拉萨市| 寿阳县| 徐闻县| 石景山区| 冕宁县| 射阳县| 乐东| 通江县| 石家庄市| 遂溪县| 加查县|