需求
- 求出 当前天, 与指定日期之间相差的天数, 指定日期一定在 当前天之前即 当前天为 01-23 , 指定日期应该为 01-22
 
解决方案
- 使用hutools工具包中提供的计算两个日期之间相差天数的方法
betweenDay()
三个参数: betweenDay(Date,Date,Boolean) 
 // 使用方式
 // cn.hutool.core.date.DateUtil.betweenDay(currentDate, targetTime, true);
 // 源码
	/**
	 * 判断两个日期相差的天数<br>
	 *
	 * <pre>
	 * 有时候我们计算相差天数的时候需要忽略时分秒。
	 * 比如:2016-02-01 23:59:59和2016-02-02 00:00:00相差一秒
	 * 如果isReset为<code>false</code>相差天数为0。
	 * 如果isReset为<code>true</code>相差天数将被计算为1
	 * </pre>
	 *
	 * @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()方法
	/**
	 * 构造<br>
	 * 在前的日期做为起始时间,在后的做为结束时间
	 * 
	 * @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;
		}
	}
 
最终的计算
	/**
	 * 判断两个日期相差的时长<br>
	 * 返回 给定单位的时长差
	 * 
	 * @param unit 相差的单位:相差 天{@link DateUnit#DAY}、小时{@link DateUnit#HOUR} 等
	 * @return 时长差
	 */
	public long between(DateUnit unit) {
		long diff = end.getTime() - begin.getTime();
		return diff / unit.getMillis();
	}
 
上面调用的after的源码
 
 abs 源码
	public static int abs(int a) {
        return (a < 0) ? -a : a;
    }
 
出现了一个小问题 bug
- 假如使用上面的处理方式, 计算出来的 两个日期之间相差的天数 永远是 正数
 - 例如
 - 今天是 2022-01-23 , 目标日期是 2022-01-22, 相差天数是 正数 1
 - 今天是 2022-01-23 , 目标日期是 2022-01-24, 相差天数也是 正数 1
 - 那么就会出现, 超时一天和临近一天得到的值相同, 与需求不一致的情况就出现了
 
修复方案
直接调用上面源码中的 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










