// 使用方式
// cn.hutool.core.date.DateUtil.betweenDay(currentDate, targetTime, true);
// 源码
/**
* 判断两个日期相差的天数
*
*
* 有时候我们计算相差天数的时候需要忽略时分秒。
* 比如:2016-02-01 23:59:59和2016-02-02 00:00:00相差一秒
* 如果isReset为false
相差天数为0。
* 如果isReset为true
相差天数将被计算为1
*
*
* @param beginDate 起始日期
* @param endDate 结束日期
* @param isReset 是否重置时间为起始时间
* @return 日期差
* @since 3.0.1
*/
public static long betweenDay(Date beginDate, Date endDate, boolean isReset) {
if (isReset) {
beginDate = beginOfDay(beginDate);
endDate = beginOfDay(endDate);
}
return between(beginDate, endDate, DateUnit.DAY);
}
继续往下的源码 只保留绝对值 ,保留绝对值, 嗯, 有点坑
between
三个参数: between(Date,Date,DateUnit)
// 注意他的 只保留绝对值
/**
* 判断两个日期相差的时长,只保留绝对值
*
* @param beginDate 起始日期
* @param endDate 结束日期
* @param unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
* @return 日期差
*/
public static long between(Date beginDate, Date endDate, DateUnit unit) {
return between(beginDate, endDate, unit, true);
}
abs, 取绝对值
between()
between(Date,Date,DateUnit,boolean)
/**
* 判断两个日期相差的时长
*
* @param beginDate 起始日期
* @param endDate 结束日期
* @param unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
* @param isAbs 日期间隔是否只保留绝对值正数
* @return 日期差
* @since 3.3.1
*/
public static long between(Date beginDate, Date endDate, DateUnit unit, boolean isAbs) {
return new DateBetween(beginDate, endDate, isAbs).between(unit);
}
对输入进行判断, 哪个时间在前, isAbs && begin.after(end) , 中的 after()方法
/**
* 构造
* 在前的日期做为起始时间,在后的做为结束时间
*
* @param begin 起始时间
* @param end 结束时间
* @param isAbs 日期间隔是否只保留绝对值正数
* @since 3.1.1
*/
public DateBetween(Date begin, Date end, boolean isAbs) {
Assert.notNull(begin, "Begin date is null !");
Assert.notNull(end, "End date is null !");
if (isAbs && begin.after(end)) {
// 间隔只为正数的情况下,如果开始日期晚于结束日期,置换之
this.begin = end;
this.end = begin;
} else {
this.begin = begin;
this.end = end;
}
}
最终的计算
/**
* 判断两个日期相差的时长
* 返回 给定单位的时长差
*
* @param unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
* @return 时长差
*/
public long between(DateUnit unit) {
long diff = end.getTime() - begin.getTime();
return diff / unit.getMillis();
}
public static int abs(int a) {
return (a < 0) ? -a : a;
}
直接调用上面源码中的 between(Date,Date,DateUnit,boolean) 方法, 是否需要 abs 自己传入
int betweenDay = (int) cn.hutool.core.date.DateUtil.between(currentDate, targetTime, DateUnit.DAY, false);
解读, 起始时间 到 结束时间 , 按照天数计算差值, isAbs 为false , 不进行绝对值运算
那么 01-20 与今天 01-24 的值就是 -4 天
那么 01-26 与今天 01-24 的值就是 1 天
又有问题了, 没有做时间转天数的处理, 26 - 24 怎么等于 1 了嘞
再次修改
Date beginDate = cn.hutool.core.date.DateUtil.beginOfDay(currentDate);
Date endDate = cn.hutool.core.date.DateUtil.beginOfDay(targetTime);
System.out.println(beginDate);
System.out.println(endDate);
int betweenDay = (int) cn.hutool.core.date.DateUtil.between(beginDate, endDate, DateUnit.DAY, false);
终于世界清净了, 负数也出来了, 正数也正常了
完整测试代码:
public static void main(String[] args) {
String dateStr = "2022-01-21 00:00:00";
String dateStr2 = "2022-01-26 00:00:00";
String currentDateString = "2022-01-24 11:01:00";
//Date currentDate = DateUtil.getCurrentDate();
System.out.println(dateStr);
DateTime targetTime = cn.hutool.core.date.DateUtil.parse(dateStr, "yyyy-MM-dd HH:mm:ss");
DateTime currentDate = cn.hutool.core.date.DateUtil.parse(currentDateString, "yyyy-MM-dd HH:mm:ss");
System.out.println(targetTime);
System.out.println(currentDate);
Date beginDate = cn.hutool.core.date.DateUtil.beginOfDay(currentDate);
Date endDate = cn.hutool.core.date.DateUtil.beginOfDay(targetTime);
System.out.println(beginDate);
System.out.println(endDate);
int betweenDay = (int) cn.hutool.core.date.DateUtil.between(beginDate, endDate, DateUnit.DAY, false);
System.out.println(betweenDay);
}
还需要根据实际需要进行判空处理, 以及异常处理.
拓展, 对于 date.after和date.befer的测试
public static void main(String[] args) {
String dateStr = "2022-01-21 00:00:00";
String dateStr2 = "2022-01-26 00:00:00";
String currentDateString = "2022-01-24 11:01:00";
//Date currentDate = DateUtil.getCurrentDate();
System.out.println(dateStr);
DateTime targetTime = cn.hutool.core.date.DateUtil.parse(dateStr, "yyyy-MM-dd HH:mm:ss");
DateTime currentDate = cn.hutool.core.date.DateUtil.parse(currentDateString, "yyyy-MM-dd HH:mm:ss");
System.out.println("targetTime..."+targetTime);
System.out.println("currentDate..."+currentDate);
boolean after = targetTime.after(currentDate);
System.out.println("targetTime.after(currentDate)..."+after);
boolean before = targetTime.before(currentDate);
System.out.println("targetTime.before(currentDate)..."+before);
}
输出结果:
2022-01-21 00:00:00
targetTime...2022-01-21 00:00:00
currentDate...2022-01-24 11:01:00
targetTime.after(currentDate)...false
targetTime.before(currentDate)...true