关于hutools工具包中, 日期函数的使用记录between(),betweenDay(),abs(),date.after()

需求

  • 求出 当前天, 与指定日期之间相差的天数, 指定日期一定在 当前天之前即 当前天为 01-23 , 指定日期应该为 01-22

解决方案

  • 使用hutools工具包中提供的计算两个日期之间相差天数的方法
    betweenDay()
    三个参数: betweenDay(Date,Date,Boolean)
 // 使用方式
 // 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(); }

上面调用的after的源码
关于hutools工具包中, 日期函数的使用记录between(),betweenDay(),abs(),date.after()_第1张图片
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

你可能感兴趣的:(后端,java,hutools,日期间隔计算,源码)