使用LocalDateTime計算兩個時間之間的間隔
自從認(rèn)識了LocalDateTime之后,使用的頻率越來越高了,使用多了就不可避免的涉及到日期的比較、加減以及計算日期間隔這些操作。
但是我發(fā)現(xiàn)自己好像不會,那就網(wǎng)上查資料,整唄。
LocalDateTime
要計算兩個LocalDateTime對象之間的間隔,可以使用java.time.Duration類。
可以很方便的獲取兩個時間之間的間隔。
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("間隔小時: " + duration.toHours());
System.out.println("間隔分鐘: " + duration.toMinutes());
System.out.println("間隔秒數(shù): " + duration.toSeconds());

通過運行程序發(fā)現(xiàn)一個問題,就是獲取的天數(shù)、小時數(shù)、分鐘數(shù)都是取整的。
如果需要精確到小數(shù),可以獲取秒數(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("間隔小時: " + duration.toHours());
System.out.println("間隔分鐘: " + duration.toMinutes());
System.out.println("間隔秒數(shù): " + duration.toSeconds());
// 自己計算
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("間隔時間: " + duration.toSeconds() + "秒, " + minutes + "分鐘, " + hours + "小時, " + day + "天");

計算的精度需要自己把控。
LocalDate
LocalDate計算日期間隔就不用借助其他工具類了,他自身就有函數(shù)可以實現(xiàn)這個功能??。
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ù)來計算月(年)數(shù)。
- 有時候需要判斷兩個時間的時間間隔是否大于一個月(年),可以通過開始日期加一月(年)然后和結(jié)束日期比較大小的方式來實現(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());

例二:

這里的意思是開始時間和結(jié)束時間之間相差0年1個月28天,連起來看才更合常理,分開來用的的場景不多。
LocalTime
要計算兩個LocalTime對象之間的間隔,也可以使用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("間隔小時: " + duration.toHours());
System.out.println("間隔分鐘: " + duration.toMinutes());
System.out.println("間隔秒數(shù): " + duration.toSeconds());
// 自己計算
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("間隔時間: " + duration.toSeconds() + "秒, " + minutes + "分鐘, " + hours + "小時, " + day + "天");

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

