前言
今天在项目中需要计算两个时间段的时间差,前端需要"XX天XX时XX分"格式的数据,发现"hutool"工具包下,有非常好用的工具类,所以写一篇文档记录一下
一、引用工具类
引用hutool工具包依赖
下面展示一些 内联代码片
。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
二、使用解析
1. DateUtil.formatBetween
可以传两个Date会自动计算毫秒值的差,下面是计算毫秒值的源代码,unit.getMillis()默认是1L
参数Level是BetweenFormatter类中的一个内部枚举
下方为实际将时间差毫秒值,转为字符串的方法
public String format() {
StringBuilder sb = new StringBuilder();
if (this.betweenMs > 0L) {
//计算天时分秒毫秒
long day = this.betweenMs / DateUnit.DAY.getMillis();
long hour = this.betweenMs / DateUnit.HOUR.getMillis() - day * 24L;
long minute = this.betweenMs / DateUnit.MINUTE.getMillis() - day * 24L * 60L - hour * 60L;
long BetweenOfSecond = ((day * 24L + hour) * 60L + minute) * 60L;
long second = this.betweenMs / DateUnit.SECOND.getMillis() - BetweenOfSecond;
long millisecond = this.betweenMs - (BetweenOfSecond + second) * 1000L;
//获取传入Level的枚举下标,从0开始
int level = this.level.ordinal();
int levelCount = 0;
//如果是调用的formatBetween方法,则this.isLevelCountValid(levelCount)一定为true,相关解析我就先不写了,需要的评论,看到了我会回复
//0L != day 只能是整除才会是1以上的整数 是0的话不拼接字符串
//level >= BetweenFormatter.Level.DAY.ordinal() 遵从最左匹配原则,比如我传的是 BetweenFormatter.Level.MINUTE 是只显示到分
if (this.isLevelCountValid(levelCount) && 0L != day && level >= BetweenFormatter.Level.DAY.ordinal()) {
sb.append(day).append(BetweenFormatter.Level.DAY.name);
++levelCount;
}
if (this.isLevelCountValid(levelCount) && 0L != hour && level >= BetweenFormatter.Level.HOUR.ordinal()) {
sb.append(hour).append(BetweenFormatter.Level.HOUR.name);
++levelCount;
}
if (this.isLevelCountValid(levelCount) && 0L != minute && level >= BetweenFormatter.Level.MINUTE.ordinal()) {
sb.append(minute).append(BetweenFormatter.Level.MINUTE.name);
++levelCount;
}
if (this.isLevelCountValid(levelCount) && 0L != second && level >= BetweenFormatter.Level.SECOND.ordinal()) {
sb.append(second).append(BetweenFormatter.Level.SECOND.name);
++levelCount;
}
if (this.isLevelCountValid(levelCount) && 0L != millisecond && level >= BetweenFormatter.Level.MILLISECOND.ordinal()) {
sb.append(millisecond).append(BetweenFormatter.Level.MILLISECOND.name);
}
}
if (StrUtil.isEmpty(sb)) {
sb.append(0).append(this.level.name);
}
return sb.toString();
}
总结
本文简单介绍了hutool工具包下的DateUtil.formatBetween使用,hutool提供了大量能使我们快速便捷地处理数据的函数和方法。