zouyu
9 小时以前 1b2f1eb44d9f0de6b9238cfe314988a95c87344a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.ruoyi.inspect.util;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.LocalDateTime;
 
/**
 * LocalDateTime 时间差计算工具
 * 功能:传入两个时间,返回保留两位小数的时间差(天/小时/分钟/秒)
 */
public class TimeDiffCalculator {
 
    // 纳秒换算常量(最精确的时间单位,无精度丢失)
    private static final long NANOS_PER_DAY = 24L * 60 * 60 * 1000000000;
    private static final long NANOS_PER_HOUR = 60L * 60 * 1000000000;
    private static final long NANOS_PER_MINUTE = 60L * 1000000000;
    private static final long NANOS_PER_SECOND = 1000000000L;
 
    /**
     * 计算 天数 差,保留两位小数
     */
    public static double getDayDiff(LocalDateTime start, LocalDateTime end) {
        return calculateDiff(start, end, NANOS_PER_DAY);
    }
 
    /**
     * 计算 小时 差,保留两位小数
     */
    public static double getHourDiff(LocalDateTime start, LocalDateTime end) {
        return calculateDiff(start, end, NANOS_PER_HOUR);
    }
 
    /**
     * 计算 分钟 差,保留两位小数
     */
    public static double getMinuteDiff(LocalDateTime start, LocalDateTime end) {
        return calculateDiff(start, end, NANOS_PER_MINUTE);
    }
 
    /**
     * 计算 秒 差,保留两位小数
     */
    public static double getSecondDiff(LocalDateTime start, LocalDateTime end) {
        return calculateDiff(start, end, NANOS_PER_SECOND);
    }
 
    /**
     * 统一计算逻辑(抽离公共代码)
     * @param unitNanos 目标单位对应的纳秒数
     */
    private static double calculateDiff(LocalDateTime start, LocalDateTime end, long unitNanos) {
        // 1. 计算时间差,取绝对值
        Duration duration = Duration.between(start, end).abs();
        // 2. 纳秒转BigDecimal,精确计算
        BigDecimal totalNanos = new BigDecimal(duration.toNanos());
        BigDecimal unit = new BigDecimal(unitNanos);
        // 3. 除法运算,保留2位小数,四舍五入
        return totalNanos.divide(unit, 2, RoundingMode.HALF_UP).doubleValue();
    }
 
}