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