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

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


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

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

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

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.15</version>
</dependency>
hutool-all中包含所有工具类的功能,适合分不清各个模块作用的“懒人”。
比如仅需要对日期进行处理,可以只引入hutool-core模块。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.15</version>
</dependency>
通过该方式,可以像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包版本之间的兼容性。


所属模块:hutool-extra
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
本例生成一个访问http://www.qfedu.com的二维码。
// 第一个参数表示访问的资源地址
// 第二个和第三个参数表示二维码图片的宽和高
// 第四个参数表示生成位置
QrCodeUtil.generate("http://www.qfedu.com/", 300, 300, FileUtil.file("d:/qrcode.jpg"));

快来扫码试试吧O(∩_∩)O哈哈~
QrCodeUtil.generate(
"http://www.qfedu.com/", //二维码内容
QrConfig.create().setImg("d:/qf-logo.jpg"), //附带logo
FileUtil.file("d:/qrcodeWithLogo.jpg")
);

所属模块:hutool-core

//当前时间
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);
//获得年的部分
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);
// 按照指定部分计算日期偏移量
// 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);
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);
// 获取指定日期所属的星座,第一个参数表示月,第二个参数表示日
String zodiac = DateUtil.getZodiac(DateUtil.month(date), 11);
System.out.println(zodiac);
// 获取指定年份对应的属相
String chineseZodiac = DateUtil.getChineseZodiac(2023);
System.out.println(chineseZodiac);
所属模块: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);
}
}
所属模块: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架构栈;如有侵权,请联系管理员删除。