【hutool的DateUtil工具类集成与使用】

目录

背景

集成使用

排雷专区:


背景


在计算订单过期时间,根据时间偏移量,和当前时间比对,来执行之后的业务逻辑。

  1.  未支付订单,定期扫描,1个小时后,自动取消支付并回滚库存;
  2. 订单退货发起申请,7天内没有退货,商家拒绝退货退款。hutool时间工具类,就排上用场了。

集成使用


  • pom.xml引入依赖
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>4.5.7</version>
</dependency>
  • 具体方法调用
package com.test.demo;


import cn.hutool.core.date.*;
import org.junit.Test;


import java.util.Calendar;
import java.util.Date;


/**
* @ClassName: DateOffset
* @description: 时间偏移量
* @author: yz
* @create: 2022-07-20 14:58
* @Version 1.0
*/
public class DateOffset {


    @Test
    public void dateUtil() {
        System.out.println("------------------获取当前时间,格式为:(yyyy-MM-dd HH:mm:ss)--------------------------------");
        //获取当前时间:2022-07-20 16:04:47
        Date date = DateUtil.date();
        //Calendar类型转Date类型:2022-07-20 16:04:47
        Date date1 = DateUtil.date(Calendar.getInstance());
        //时间戳转date:2022-07-20 16:04:47
        Date date2 = DateUtil.date(System.currentTimeMillis());


        System.out.println("------------------获取当前时间字符串--------------------------------");
        //当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
        String now = DateUtil.now(); // 2022-07-20 16:04:47
        //当前日期字符串,格式:yyyy-MM-dd
        String today = DateUtil.today(); // 2022-07-20


        System.out.println("------------------Date类型格式化成字符串时间--------------------------------");
        // 格式化为指定格式的字符串
        String formatDate = DateUtil.format(date, "yyyy/MM/dd");//结果:2022/07/20
        // 格式化为时间为日期字符串
        String formatDate1 = DateUtil.formatDate(date);//2022-07-20
        //时间转化为Strng类型
        String dateTime = DateUtil.formatDateTime(date2);//2022-07-20 16:20:26
        //时间转化时间字符串
        String time = DateUtil.formatTime(date1); //16:25:27


        System.out.println("------------------获取指定日期的年月日信息--------------------------------");
        //获取年份
        int year = DateUtil.year(date);
        //获取月份,从0开始计算,需要对结果加一
        int month = DateUtil.month(date) + 1;
        //当前时间的昨天
        DateTime yesterday = DateUtil.yesterday();


        System.out.println("------------------获取某天/某月的开始或结束时间--------------------------------");


        //一天的开始时间:2022-07-20 00:00:00
        Date beginOfDay = DateUtil.beginOfDay(date);
        //一天的结束时间
        Date endOfDay = DateUtil.endOfDay(date);
        //当月的开始时间
        Date beginOfMonth = DateUtil.beginOfMonth(date);
        //当月的结束时间
        Date endOfMonth = DateUtil.endOfMonth(date);
        //当前年份的最后一天
        Date endOfYear = DateUtil.endOfYear(date);


        System.out.println("------------------获取时间偏移(向前或向后)--------------------------------");
        //当前时间推迟一天:2022-07-21 17:16:42
        Date offset = DateUtil.offset(date1, DateField.DAY_OF_MONTH, 1);
        //当前推迟一天:2022-07-21 17:16:42
        Date offsetMonth = DateUtil.offsetDay(date2, 1);
        //推迟一天
        Date offset3 = DateUtil.offset(date, DateField.DAY_OF_YEAR, 1);
        //推迟一天
        Date offset4 = DateUtil.offset(date, DateField.DAY_OF_WEEK, 1);


        //提前一天:2022-07-19 17:16:42
        Date offset1 = DateUtil.offset(date, DateField.DAY_OF_MONTH, -1);


        //当前推迟2个月:2022-09-20 17:19:47
        Date offset2 = DateUtil.offset(date1, DateField.MONTH, 2);
        //当前推迟2个月:2022-09-20 17:19:47
        Date offsetMonth1 = DateUtil.offsetMonth(date1, 2);
        //延长30s:2022-07-20 17:24:38
        Date offset5 = DateUtil.offsetSecond(date, 30);


        //延长2个小时;2022-07-20 19:36:42
        Date offsetHour = DateUtil.offsetHour(date, 2);
        //延长2个小时;2022-07-20 19:36:42
        Date offsetHour1 = DateUtil.offset(date, DateField.HOUR, 2);
        //延长2个小时;2022-07-20 19:36:42
        Date offsetHour2 = DateUtil.offset(date, DateField.HOUR_OF_DAY, 2);
        //明天
        Date tomorrow = DateUtil.tomorrow();
        //上周
        Date Date = DateUtil.lastWeek();
        //下周
        Date Date1 = DateUtil.nextWeek();
        //上个月
        Date Date2 = DateUtil.lastMonth();
        //下个月
        Date Date3 = DateUtil.nextMonth();


        System.out.println("------------------between获取日期天数差和小时差--------------------------------");


        //两个时间段相差的天数:0
        long betweenDay = DateUtil.between(date1, date2, DateUnit.DAY);
        //两个时间段相差的小时:当前比明天相差24小时
        long betweenHour = DateUtil.between(date1, offset, DateUnit.HOUR);
        //当前距离下一月相差几周:4
        long weekHour = DateUtil.between(date1, Date3, DateUnit.WEEK);


        long betweenDay2 = DateUtil.between(date, offsetHour2, DateUnit.MS);//7200000
        //时间差格式化:截取相应时段
        String formatBetween = DateUtil.formatBetween(betweenDay2, BetweenFormater.Level.HOUR);//2小时


        DateTime parse = DateUtil.parse("2022-07-21 10:05:22");
        DateTime parse1 = DateUtil.parse("2022-07-21 12:15:32");
        String formatBetween2 = DateUtil.formatBetween(parse, parse1, BetweenFormater.Level.MINUTE);//2小时10分
        String formatBetween3 = DateUtil.formatBetween(parse, parse1, BetweenFormater.Level.SECOND);//2小时10分10秒
        String formatBetween4 = DateUtil.formatBetween(parse, parse1, BetweenFormater.Level.DAY);//0天


        System.out.println("------------------其他--------------------------------");
        //根据出生日期计算年龄
        int ageOfNow = DateUtil.ageOfNow("1992-01-13"); //30
        //某年是否为闰年
        boolean leapYear = DateUtil.isLeapYear(2004); //true


    }
}

排雷专区:


  1. 获取当前时间的方法,默认格式为yyyy-MM-dd HH:mm:ss,这样输出的结果一样。
public static void main(String[] args) {

    Date date = DateUtil.date();
    //Calendar类型
    Date date1 = DateUtil.date(Calendar.getInstance());
    //时间戳转date
    Date date2 = DateUtil.date(System.currentTimeMillis());
    
    System.out.println(date);
    System.out.println(date1);
    System.out.println(date2);
}
  • 结果展示

2.针对1中,格式化到ms级别,即格式为:yyyy-MM-dd HH:mm:ss.SSSSSS,数据是有差别的。

public static void main(String[] args) {

    Date date = DateUtil.date();
    //Calendar类型
    Date date1 = DateUtil.date(Calendar.getInstance());
    //时间戳转date
    Date date2 = DateUtil.date(System.currentTimeMillis());

    String format = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss.SSSSSS");
    String format1 = DateUtil.format(date1, "yyyy-MM-dd HH:mm:ss.SSSSSS");
    String format2 = DateUtil.format(date2, "yyyy-MM-dd HH:mm:ss.SSSSSS");

    System.out.println(format);
    System.out.println(format1);
    System.out.println(format2);
}
  • 结果展示:

3.基于2,产生了下面的问题:

    两种方法获取当前时间,date1,date2,然后对时间进行延长2个小时处理,生成offsetHour1,offsetHour2;那么目前data1=date2,offsetHour1=offsetHour2

现在我想看看时间是不是差二个小时?

我用DateUtil.between()函数:

首先DateUtil.between(date1, offsetHour1, DateUnit.MS);前两个参数分别是date1以及它所推迟的时间offsetHour1,输出正常;

因为offsetHour1=offsetHour2,那么我把上述第二个参数换成offsetHour2,应该也是一样的结果,结果是不一样的;

同样我把第一个参数改成date2,第二个参数还是offsetHour1,结果也是错误的;

 上述和第三个参数无关。

问题原因就是:它们产生的毫秒级数据结果,实际是不相同的,所以产生的产值会不同。

public static void main(String[] args) {


    Date date1 = DateUtil.date(Calendar.getInstance());
    Date date2 = DateUtil.date();


    //将时间推迟2个小时
    Date offsetHour1 = DateUtil.offsetHour(date1, 2);
    Date offsetHour2 = DateUtil.offsetHour(date2, 2);


    System.out.println("方法一输出当前时间:" + date1);
    System.out.println("方法二输出当前时间:" + date2);
    System.out.println("方法一输出推迟时间:" + offsetHour1);
    System.out.println("方法二输出推迟时间:" + offsetHour2);


    //正常的差值
    long betweenDay = DateUtil.between(date1, offsetHour1, DateUnit.MS);
    long betweenDay1 = DateUtil.between(date1, offsetHour2, DateUnit.MS);
    long betweenDay2 = DateUtil.between(date2, offsetHour1, DateUnit.MS);
    long betweenDay5 = DateUtil.between(date2, offsetHour1, DateUnit.SECOND);


    System.out.println("正常的差值-时间差精确到豪秒:" + betweenDay);
    System.out.println("时间差精确到豪秒:" + betweenDay1);
    System.out.println("时间差精确到豪秒:" + betweenDay2);
    System.out.println("时间差精确到秒:" + betweenDay5);


}
  • 结果展示:

4.基于3,正常的差值方法应该是: DateUtil.between(参数1,参数2,参数3),参数2应该和参数1紧密相关,也就是参数2是在参数1的基础上生成的,其中参数1和参数2位置可以互换不影响实际结果。

public static void main(String[] args) {


    Date date1 = DateUtil.date(Calendar.getInstance());
    Date date2 = DateUtil.date();


    //将时间推迟2个小时
    Date offsetHour1 = DateUtil.offsetHour(date1, 2);
    Date offsetHour2 = DateUtil.offsetHour(date2, 2);


    System.out.println("方法一输出当前时间:" + date1);
    System.out.println("方法二输出当前时间:" + date2);
    System.out.println("方法一输出推迟时间:" + offsetHour1);
    System.out.println("方法二输出推迟时间:" + offsetHour2);

    long betweenDay = DateUtil.between(date1, offsetHour1, DateUnit.MS);
    long betweenDay1 = DateUtil.between(date2, offsetHour2, DateUnit.MS);
    long betweenDay2 = DateUtil.between(offsetHour2, date2, DateUnit.MS);
    long betweenDay5 = DateUtil.between(date2, offsetHour2, DateUnit.SECOND);

    System.out.println("正常的差值-时间差精确到豪秒:" + betweenDay);
    System.out.println("时间差精确到豪秒:" + betweenDay1);
    System.out.println("时间差精确到豪秒:" + betweenDay2);
    System.out.println("时间差精确到秒:" + betweenDay5);


}
  • 结果展示:

 


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值