使用LocalDateTime計(jì)算兩個(gè)時(shí)間之間的間隔
自從認(rèn)識(shí)了LocalDateTime之后,使用的頻率越來(lái)越高了,使用多了就不可避免的涉及到日期的比較、加減以及計(jì)算日期間隔這些操作。
但是我發(fā)現(xiàn)自己好像不會(huì),那就網(wǎng)上查資料,整唄。
LocalDateTime
要計(jì)算兩個(gè)LocalDateTime對(duì)象之間的間隔,可以使用java.time.Duration類。
可以很方便的獲取兩個(gè)時(shí)間之間的間隔。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime startTime = LocalDateTime.of(2024, 7, 26, 5, 22, 56);
LocalDateTime endTime = LocalDateTime.of(2024, 7, 26, 20, 23, 15);
Duration duration = Duration.between(startTime, endTime);
System.out.println(startTime.format(formatter) + "\n" + endTime.format(formatter));
System.out.println("間隔天數(shù):" + duration.toDays());
System.out.println("間隔小時(shí): " + duration.toHours());
System.out.println("間隔分鐘: " + duration.toMinutes());
System.out.println("間隔秒數(shù): " + duration.toSeconds());

通過(guò)運(yùn)行程序發(fā)現(xiàn)一個(gè)問(wèn)題,就是獲取的天數(shù)、小時(shí)數(shù)、分鐘數(shù)都是取整的。
如果需要精確到小數(shù),可以獲取秒數(shù)自己計(jì)算。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime startTime = LocalDateTime.of(2024, 7, 26, 5, 22, 56);
LocalDateTime endTime = LocalDateTime.of(2024, 7, 26, 20, 23, 15);
Duration duration = Duration.between(startTime, endTime);
System.out.println(startTime.format(formatter) + "\n" + endTime.format(formatter));
System.out.println("間隔天數(shù):" + duration.toDays());
System.out.println("間隔小時(shí): " + duration.toHours());
System.out.println("間隔分鐘: " + duration.toMinutes());
System.out.println("間隔秒數(shù): " + duration.toSeconds());
// 自己計(jì)算
BigDecimal divisor = BigDecimal.valueOf(60);
BigDecimal minutes = BigDecimal.valueOf(duration.toSeconds()).divide(divisor, 2, RoundingMode.HALF_UP);
BigDecimal hours = BigDecimal.valueOf(duration.toSeconds()).divide(divisor.multiply(divisor), 2, RoundingMode.HALF_UP);
BigDecimal day = BigDecimal.valueOf(duration.toSeconds()).divide(divisor.multiply(divisor).multiply(BigDecimal.valueOf(24)), 2, RoundingMode.HALF_UP);
System.out.println("間隔時(shí)間: " + duration.toSeconds() + "秒, " + minutes + "分鐘, " + hours + "小時(shí), " + day + "天");

計(jì)算的精度需要自己把控。
LocalDate
LocalDate計(jì)算日期間隔就不用借助其他工具類了,他自身就有函數(shù)可以實(shí)現(xiàn)這個(gè)功能??。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.of(2024, 11, 23);
LocalDate endDate = LocalDate.of(2024, 11, 26);
long days = startDate.until(endDate, ChronoUnit.DAYS);
System.out.println(startDate.format(formatter) + "\n" + endDate.format(formatter));
System.out.println("間隔天數(shù):" + days);

- 基本算到天數(shù)就可以了,每月(年)的天數(shù)都是不固定的,也不好用天數(shù)來(lái)計(jì)算月(年)數(shù)。
- 有時(shí)候需要判斷兩個(gè)時(shí)間的時(shí)間間隔是否大于一個(gè)月(年),可以通過(guò)開始日期加一月(年)然后和結(jié)束日期比較大小的方式來(lái)實(shí)現(xiàn)。
還有一種算法,可以這樣:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.of(2024, 9, 23);
LocalDate endDate = LocalDate.of(2024, 11, 26);
Period until = startDate.until(endDate);
System.out.println(startDate.format(formatter) + "\n" + endDate.format(formatter));
System.out.println("間隔年數(shù):" + until.getYears());
System.out.println("間隔月數(shù):" + until.getMonths());
System.out.println("間隔天數(shù):" + until.getDays());

例二:

這里的意思是開始時(shí)間和結(jié)束時(shí)間之間相差0年1個(gè)月28天,連起來(lái)看才更合常理,分開來(lái)用的的場(chǎng)景不多。
LocalTime
要計(jì)算兩個(gè)LocalTime對(duì)象之間的間隔,也可以使用java.time.Duration類。
可以參考LocalDateTime。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime startTime = LocalTime.of(4, 7, 25);
LocalTime endTime = LocalTime.of(20, 7, 26);
Duration duration = Duration.between(startTime, endTime);
System.out.println(startTime.format(formatter) + "\n" + endTime.format(formatter));
System.out.println("間隔天數(shù):" + duration.toDays());
System.out.println("間隔小時(shí): " + duration.toHours());
System.out.println("間隔分鐘: " + duration.toMinutes());
System.out.println("間隔秒數(shù): " + duration.toSeconds());
// 自己計(jì)算
BigDecimal divisor = BigDecimal.valueOf(60);
BigDecimal minutes = BigDecimal.valueOf(duration.toSeconds()).divide(divisor, 2, RoundingMode.HALF_UP);
BigDecimal hours = BigDecimal.valueOf(duration.toSeconds()).divide(divisor.multiply(divisor), 2, RoundingMode.HALF_UP);
BigDecimal day = BigDecimal.valueOf(duration.toSeconds()).divide(divisor.multiply(divisor).multiply(BigDecimal.valueOf(24)), 2, RoundingMode.HALF_UP);
System.out.println("間隔時(shí)間: " + duration.toSeconds() + "秒, " + minutes + "分鐘, " + hours + "小時(shí), " + day + "天");

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 從Date到LocalDateTime解析Java JDBC時(shí)間類型映射
- Java日期時(shí)間詳解(LocalDate、LocalTime、LocalDateTime)
- Java中Date、LocalDate、LocalDateTime、LocalTime、時(shí)間戳之間的相互轉(zhuǎn)換代碼
- SpringBoot解析LocalDateTime失?。篣niapp傳輸時(shí)間變1970的原因與解決方案
- java LocalDateTime加時(shí)間,計(jì)算兩個(gè)時(shí)間的差方式
- Java中各類日期和時(shí)間轉(zhuǎn)換超詳析總結(jié)(Date和LocalDateTime相互轉(zhuǎn)換等)
- java傳入時(shí)間戳返回LocalDateTime的實(shí)現(xiàn)方法
- 關(guān)于LocalDateTime最常用方法和時(shí)間轉(zhuǎn)換方式
相關(guān)文章
Java中用Socket實(shí)現(xiàn)HTTP文件上傳實(shí)例
本篇文章主要介紹了Java中用Socket實(shí)現(xiàn)HTTP文件上傳實(shí)例,詳細(xì)的介紹了通過(guò)讀取Socket的輸入流來(lái)實(shí)現(xiàn)一個(gè)文件上傳的功能,有興趣的同學(xué)可以一起了解一下2017-04-04
Spring Boot 基于注解的 Redis 緩存使用詳解
本篇文章主要介紹了Spring Boot 基于注解的 Redis 緩存使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
IDEA+Maven搭建JavaWeb項(xiàng)目的方法步驟
本文主要介紹了IDEA+Maven搭建JavaWeb項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Spring響應(yīng)式編程之Reactor操作符詳解
文章介紹了Reactor庫(kù)中常用的響應(yīng)式流操作符,分為創(chuàng)建、轉(zhuǎn)換、組合、條件和錯(cuò)誤處理五類,詳細(xì)列舉了每類操作符的功能和用途,這些操作符旨在提高響應(yīng)式流的可讀性和開發(fā)效率,幫助開發(fā)者更高效地處理數(shù)據(jù)流2025-09-09
淺談springboot項(xiàng)目中定時(shí)任務(wù)如何優(yōu)雅退出
這篇文章主要介紹了淺談springboot項(xiàng)目中定時(shí)任務(wù)如何優(yōu)雅退出?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
為zookeeper配置相應(yīng)的acl權(quán)限
這篇文章主要介紹了為zookeeper配置相應(yīng)的acl權(quán)限的相關(guān)實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
Java實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題與讀者寫者問(wèn)題詳解
這篇文章主要介紹了Java實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題與讀者寫者問(wèn)題詳解,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的親朋好友參考。2017-11-11
Java高并發(fā)編程之CAS實(shí)現(xiàn)無(wú)鎖隊(duì)列代碼實(shí)例
這篇文章主要介紹了Java高并發(fā)編程之CAS實(shí)現(xiàn)無(wú)鎖隊(duì)列代碼實(shí)例,在多線程操作中,我們通常會(huì)添加鎖來(lái)保證線程的安全,那么這樣勢(shì)必會(huì)影響程序的性能,那么為了解決這一問(wèn)題,于是就有了在無(wú)鎖操作的情況下依然能夠保證線程的安全,需要的朋友可以參考下2023-12-12

