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(); } }