ITPub博客

首页 > 数据库 > 数据库开发技术 > 哆啦A梦的万能口袋—难得Hutool

哆啦A梦的万能口袋—难得Hutool

原创 数据库开发技术 作者:Finally_m 时间:2023-04-03 08:00:00 0 删除 编辑
关注Java架构栈,干货天天都不断!

曾几何时,老任还是小任的时候,总是幻想自己能拥有一个哆啦A梦的万能口袋。通过任意门,可以想去哪就去哪;通过时光机,可以看看未来的媳妇长啥样;通过竹蜻蜓,可以像鸟儿一样在空中自由飞翔......



长大后,老任成为了程序猿,虽然没有拥有哆啦A梦的万能口袋,但却意外获得了程序猿的万能口袋,一款小而美的工具集——Hutool。



 Hutool介绍


Hutool是一个小而全的Java工具类库,通过静态方法进行封装。Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面。Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间。

Hutool的主要模块如下:



怎么样?只有你想不到,没有它做不到吧。有没有突然感觉自己封装的工具类瞬间不香了呢!!!



官方文档:https://hutool.cn/docs/#/


 引入方式


1、“无脑”引入

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.15</version>
</dependency>


hutool-all中包含所有工具类的功能,适合分不清各个模块作用的“懒人”。


2、按需引入

比如仅需要对日期进行处理,可以只引入hutool-core模块。

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-core</artifactId>
    <version>5.8.15</version>
</dependency>


3.bom方式

通过该方式,可以像Spring-Boot一样引入Hutool,再由子模块决定用到哪些模块。

在父模块中申明:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-bom</artifactId>
            <version>${hutool.version}</version>
            <type>pom</type>
            
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>


在子模块中引入:

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-core</artifactId>
    </dependency>
</dependencies>
</section>

BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。


 使用攻略



1、二维码

所属模块:hutool-extra

1.1 额外引入jar

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.3</version>
</dependency>


1.2 生成普通二维码

本例生成一个访问http://www.qfedu.com的二维码。

// 第一个参数表示访问的资源地址
// 第二个和第三个参数表示二维码图片的宽和高
// 第四个参数表示生成位置
QrCodeUtil.generate("http://www.qfedu.com/", 300, 300, FileUtil.file("d:/qrcode.jpg"));



快来扫码试试吧O(∩_∩)O哈哈~


1.3 生成带logo的二维码

QrCodeUtil.generate(
        "http://www.qfedu.com/", //二维码内容
        QrConfig.create().setImg("d:/qf-logo.jpg"), //附带logo
        FileUtil.file("d:/qrcodeWithLogo.jpg")
);



2.DateUtil

所属模块:hutool-core



2.1 日期和字符串的转换

//当前时间
Date date = DateUtil.date();

// 按照自定义格式进行格式化,比如2023/03/11 22:04:06
String format = DateUtil.format(date, "yyyy/MM/dd HH:mm:ss");
System.out.println(format);

//格式化为yyyy-MM-dd,比如2023-03-11
String formatDate = DateUtil.formatDate(date);
System.out.println(formatDate);

//格式化为 yyyy-MM-dd HH:mm:ss, 比如2023-03-11 22:04:06
String formatDateTime = DateUtil.formatDateTime(date);
System.out.println(formatDateTime);

//格式化为HH:mm:ss, 比如22:04:06
String formatTime = DateUtil.formatTime(date);
System.out.println(formatTime);

String dateStr = "2023-01-01 12:23:34";
// 指定格式时间字符串转为Date对象
Date date2 = DateUtil.parse(dateStr);
System.out.println(date2);


2.2 获取日期中指定的部分的数据

//获得年的部分
int year = DateUtil.year(date);
System.out.println(year);

//获得月份,从0开始计数
int month = DateUtil.month(date);
System.out.println(month);

// 获取日
int dayOfMonth = DateUtil.dayOfMonth(date);
System.out.println(dayOfMonth);

// 获取小时,第二个参数表示是否使用24小时制
int hour = DateUtil.hour(date, true);
System.out.println(hour);


2.3 日期的偏移计算

// 按照指定部分计算日期偏移量
// DateTime是java.util.Date的子类
// 第二个参数用于指定日期的哪个部分参与计算偏移量
DateTime offset = DateUtil.offset(date, DateField.DAY_OF_MONTH, 5);
System.out.println(offset);

// 根据月计算偏移量
DateTime dateTime = DateUtil.offsetMonth(date, 3);
System.out.println(dateTime);

// 根据计算日的偏移量
DateTime dateTime2 = DateUtil.offsetDay(date, -3);
System.out.println(dateTime2);

// 获取昨天的日期
DateTime yesterday = DateUtil.yesterday();
System.out.println(yesterday);

// 获取明天的日期
DateTime tomorrow = DateUtil.tomorrow();
System.out.println(tomorrow);

// 获取上个月的日期
DateTime dateTime3 = DateUtil.lastMonth();
System.out.println(dateTime3);

// 获取下个月的日期
DateTime dateTime4 = DateUtil.nextMonth();
System.out.println(dateTime4);


2.4 时间差计算

Date date3 = DateUtil.parse("2023-03-01 22:33:23");
Date date4 = DateUtil.parse("2023-03-11 01:18:23");

// 最后一个参数指定日期差值的单位,返回的是相差的绝对值
long betweenDay = DateUtil.between(date4, date3, DateUnit.DAY);
System.out.println(betweenDay);


2.5 星座和属相

// 获取指定日期所属的星座,第一个参数表示月,第二个参数表示日
String zodiac = DateUtil.getZodiac(DateUtil.month(date), 11);
System.out.println(zodiac);

// 获取指定年份对应的属相
String chineseZodiac = DateUtil.getChineseZodiac(2023);
System.out.println(chineseZodiac);


3.LocalDateTimeUtil

所属模块:hutool-core


package com.qfedu.hutool;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;

public class LocalDateTimeTest {
    public static void main(String[] args) {
        // Date对象转换为LocalDateTime
        LocalDateTime localDateTime = LocalDateTimeUtil.of(new Date());
        System.out.println(localDateTime);

        LocalDateTime localDateTime2 = DateUtil.toLocalDateTime(new Date());
        System.out.println(localDateTime2);

        // 时间戳转换为LocalDateTime
        LocalDateTime localDateTime3 = LocalDateTimeUtil.ofUTC(new Date().getTime());
        System.out.println(localDateTime3);

        // 日期字符串解析,该方法中,年月日和时间之间必须使用T
        LocalDateTime localDateTime4 = LocalDateTimeUtil.parse("2023-03-11T12:23:56");
        System.out.println(localDateTime4);

        // 解析自定义格式时间,第二个参数指定日期的格式化串
        LocalDateTime localDateTime5 = LocalDateTimeUtil.parse("2020-01-23 12:23:34", DatePattern.NORM_DATETIME_PATTERN);
        System.out.println(localDateTime5);

        // 日期字符串转为LocalDate对象
        LocalDate localDate = LocalDateTimeUtil.parseDate("2020-01-23");
        System.out.println(localDate);

        // LocalDateTime转为指定格式的字符串
        String format = LocalDateTimeUtil.format(localDateTime, DatePattern.NORM_DATETIME_PATTERN);
        System.out.println(format);

        // 增加一天
        LocalDateTime offset = LocalDateTimeUtil.offset(localDateTime, 1, ChronoUnit.DAYS);
        System.out.println(offset);

        // 如果是减少时间,offset第二个参数传负数即可
        offset = LocalDateTimeUtil.offset(localDateTime, -1, ChronoUnit.DAYS);
        System.out.println(offset);

        LocalDateTime start = LocalDateTimeUtil.parse("2023-02-02T00:00:00");
        LocalDateTime end = LocalDateTimeUtil.parse("2023-03-12T00:00:00");
        // 计算时间间隔, 返回Duration对象
        Duration between = LocalDateTimeUtil.between(start, end);
        between.toDays();
        long l = between.toDays();
        System.out.println(l);
    }
}


4.jwt工具

所属模块:hutool-jwt


package com.qfedu.hutool;

import cn.hutool.core.date.DateUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTHeader;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.JWTValidator;

import java.util.HashMap;
import java.util.Map;

public class JwtTest {

    public static void main(String[] args) {
        // 存放payload的map对象
        Map<String, Object> map = new HashMap<String, Object>() {
            private static final long serialVersionUID = 1L;

            {
                put("username", "qfedu");
                put("expire_time", System.currentTimeMillis() + 1000 * 1 * 60);
            }
        };
        // eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHBpcmVfdGltZSI6MTY3ODUyMzExNjM1MiwidXNlcm5hbWUiOiJxZmVkdSJ9.8Szl11ENv-Zo6_R3FC41KfohwNuu5yYQdY1fW75X3aA
        // 1 生成token
        String key = "1234";
        String token = JWTUtil.createToken(map, key.getBytes());
        System.out.println(token);

        String token2 = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHBpcmVfdGltZSI6MTY3ODUyMzExNjM1MiwidXNlcm5hbWUiOiJxZmVkdSJ9.8Szl11ENv-Zo6_R3FC41KfohwNuu5yYQdY1fW75X3aA";
        // 2 解析token
        JWT jwt = JWTUtil.parseToken(token2);
        // 获取jwt头
        System.out.println(jwt.getHeader(JWTHeader.TYPE));
        System.out.println(jwt.getHeader(JWTHeader.ALGORITHM));
        // 获取指定的payload
        System.out.println(jwt.getPayload("username"));

        // 3 验证jwt的合法性
        boolean verify = JWTUtil.verify(token, "1234".getBytes());
        System.out.println(verify);
        
        // 4 既检查合法性,也检查是否过期
        boolean validate = jwt.validate(0);
        System.out.println(validate);

    }
}


本文只是抛砖引玉,Hutool中提供的工具类实在是太多了,想要了解更多的功能,马上进入它的官方帮助文档看看吧。相信我,你一定会爱上它的。


如果你还有不明白的地方,可以在评论区或私信给我留言。关注Java架构栈,干货天天都不断哦。

- END -


近期课程上新:
Java基础 | Javaweb基础 | Java高级框架 | 微服务架构 | TiDB分布式数据库入门最佳实践 | VUE全面剖析及前后端联动实战 | 23种设计模式 | 企业级项目实战 | Java面试宝典

原文作者:Java架构栈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-04-13

  • 博文量
    573
  • 访问量
    243835