关于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);
 // 源码
	/**
	 * 判断两个日期相差的天数<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
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DateUtil.betweenDay方法是一个用于计算两个日期之间相差的天数的方法。根据引用,它的使用方法是通过传入两个日期参数和一个布尔值参数来指定是否包括两个日期在内。这个方法返回的是一个整数,表示两个日期之间相差的天数。 根据引用和引用,在使用这个方法时,需要确保传入的日期参数是按照特***并将其作为参数传入between方法。这样可以确保计算的是整天的差异。 如果在计算两个日期之间天数时出现了差异,比如引用提到的 26 - 24 等于 1 的问题,可以考虑使用abs函数来获取两个日期差的绝对值,***为了计算两个日期之间天数差异,可以使用DateUtil.betweenDay方法,并根据具体需求进行参数的设置和处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java-计算两个时间相差的天数](https://blog.csdn.net/weixin_45149147/article/details/102635750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [关于hutools工具包, 日期函数使用记录between(),betweenDay(),abs(),date.after()](https://blog.csdn.net/yang_1011123/article/details/122655945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值