1. Java自带工具方法

1.1 List集合拼接成以逗号分隔的字符串

// 如何把list集合拼接成以逗号分隔的字符串 a,b,c
List<String> list = Arrays.asList("a", "b", "c");
// 第一种方法,可以用stream流
String join = list.stream().collect(Collectors.joining(","));
System.out.println(join); // 输出 a,b,c
// 第二种方法,其实String也有join方法可以实现这个功能
String join = String.join(",", list);
System.out.println(join);
// 输出 a,b,c

1.2 比较两个字符串是否相等,忽略大小写

/*
*当我们用equals比较两个对象是否相等的时候,还需要对左边的对象进行判空,不然可能会报空指针异常,
*我们可以用java.util包下Objects封装好的比较是否相等的方法
*/
System.out.println(Objects.equals(strA, strB));
// 输出结果:false

1.3 比较两个对象是否相等

//当我们用equals比较两个对象是否相等的时候,还需要对左边的对象进行判空,不然可能会报空指针异常,我们可以用java.util包下Objects封装好的比较是否相等的方法
String strA = "songwp";
String strB = "SONGWP";
if (strA.equalsIgnoreCase(strB)) {
System.out.println("相等");
}
// 输出结果:相等

// 源码是这样的
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}

1.4 两个List集合取交集

List<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
List<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("b");
list2.add("d");
list1.retainAll(list2);
System.out.println(list1);
// 输出结果:[a, b]

2. apache commons工具类库

apache commons是最强大的,也是使用最广泛的工具类库,里面的子库非常多,下面介绍几个最常用的

2.1 commons-lang,java.lang的增强版

建议使用commons-lang3,优化了一些api,原来的commons-lang已停止更新

Maven依赖是:

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>

2.1.1 字符串判空

传参CharSequence类型是String、StringBuilder、StringBuffer的父类,都可以直接下面方法判空,以下是源码:

public static boolean isEmpty(final CharSequence cs) {
return cs == null || cs.length() == 0;
}
public static boolean isNotEmpty(final CharSequence cs) {
return !isEmpty(cs);
}
// 判空的时候,会去除字符串中的空白字符,比如空格、换行、制表符
public static boolean isBlank(final CharSequence cs) {
final int strLen = length(cs);
if (strLen == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
public static boolean isNotBlank(final CharSequence cs) {
return !isBlank(cs);
}

2.1.2 首字母转成大写

String str = "yideng";
String capitalize = StringUtils.capitalize(str);
System.out.println(capitalize); // 输出Yideng

2.1.3 重复拼接字符串

String str = StringUtils.repeat("ab", 2);
System.out.println(str); // 输出abab

2.1.4 格式化日期

 // Date类型转String类型
String date = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
System.out.println("Date类型转String类型:"+date);
// 输出结果: Date类型转String类型:2023-06-06 15:16:13
// String类型转Date类型
Date date1 = DateUtils.parseDate("2021-05-01 01:01:01", "yyyy-MM-dd HH:mm:ss");
System.out.println("String类型转Date类型:"+date1);
// 输出结果:String类型转Date类型:Sat May 01 01:01:01 CST 2021
System.out.println("计算一年后的日期:"+DateUtils.addYears(new Date(), 1));
//输出结果:计算一年后的日期:Thu Jun 06 15:16:13 CST 2024
System.out.println("计算一个月后的日期:"+DateUtils.addMonths(new Date(), 1));
//输出结果:输出结果:计算一个月后的日期:Thu Jul 06 15:16:13 CST 2023
System.out.println("计算一天后的日期:"+DateUtils.addDays(new Date(), 1));
//输出结果:计算一天后的日期:Wed Jun 07 15:16:13 CST 2023
System.out.println("计算一周后的日期:"+DateUtils.addWeeks(new Date(), 1));
//输出结果:计算一周后的日期:Tue Jun 13 15:16:13 CST 2023
System.out.println("计算一个小时后的日期:"+DateUtils.addHours(new Date(), 1));
//输出结果:计算一个小时后的日期:Tue Jun 06 16:16:13 CST 2023
System.out.println("计算一秒后的日期:"+DateUtils.addSeconds(new Date(), 1));
//输出结果:计算一秒后的日期:Tue Jun 06 15:16:14 CST 2023
System.out.println("计算一分钟后的日期:"+DateUtils.addMinutes(new Date(), 1));
//输出结果:计算一分钟后的日期:Tue Jun 06 15:17:13 CST 2023
System.out.println("计算一毫秒后的日期:"+DateUtils.addMilliseconds(new Date(), 1));
//输出结果:计算一毫秒后的日期:Tue Jun 06 15:16:13 CST 2023

2.1.5 包装临时对象

当一个方法需要返回两个及以上字段时,我们一般会封装成一个临时对象返回,现在有了Pair和Triple就不需要了

// 返回两个字段
ImmutablePair<Integer, String> pair = ImmutablePair.of(1, "yideng");
System.out.println(pair.getLeft() + "," + pair.getRight());
// 输出 1,yideng
// 返回三个字段
ImmutableTriple<Integer, String, Date> triple = ImmutableTriple.of(1, "yideng", new Date());
System.out.println(triple.getLeft() + "," + triple.getMiddle() + "," + triple.getRight());
// 输出 1,yideng,Wed Apr 07 23:30:00 CST 2021

2.2 commons-collections 集合工具类

Maven依赖是:

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>

2.2.1 集合判空

封装了集合判空的方法,以下是源码:

public static boolean isEmpty(final Collection<?> coll) {
return coll == null || coll.isEmpty();
}
public static boolean isNotEmpty(final Collection<?> coll) {
return !isEmpty(coll);
}
// 两个集合取交集
Collection<String> collection = CollectionUtils.retainAll(listA, listB);
// 两个集合取并集
Collection<String> collection = CollectionUtils.union(listA, listB);
// 两个集合取差集
Collection<String> collection = CollectionUtils.subtract(listA, listB);

2.3 common-beanutils 操作对象

Maven依赖:

<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
public class User {
private Integer id;
private String name;
}
设置对象属性 User user = new User();
BeanUtils.setProperty(user, "id", 1);
BeanUtils.setProperty(user, "name", "yideng");
System.out.println(BeanUtils.getProperty(user, "name")); // 输出 yideng
System.out.println(user); // 输出 {"id":1,"name":"yideng"}
对象和map互转 // 对象转map
Map<String, String> map = BeanUtils.describe(user);
System.out.println(map); // 输出 {"id":"1","name":"yideng"}
// map转对象
User newUser = new User();
BeanUtils.populate(newUser, map);
System.out.println(newUser); // 输出 {"id":1,"name":"yideng"}

2.4 commons-io 文件流处理

Maven依赖:

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
文件处理 File file = new File("demo1.txt");
// 读取文件
List<String> lines = FileUtils.readLines(file, Charset.defaultCharset());
// 写入文件
FileUtils.writeLines(new File("demo2.txt"), lines);
// 复制文件
FileUtils.copyFile(srcFile, destFile);

3. Google Guava 工具类库

Maven依赖:

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
</dependency>

3.1 创建集合

List<String> list = Lists.newArrayList();
List<Integer> list = Lists.newArrayList(1, 2, 3);
// 反转list
List<Integer> reverse = Lists.reverse(list);
System.out.println(reverse); // 输出 [3, 2, 1]
// list集合元素太多,可以分成若干个集合,每个集合10个元素
List<List<Integer>> partition = Lists.partition(list, 10);
// 创建map和set
Map<String, String> map = Maps.newHashMap();
Set<String> set = Sets.newHashSet();

3.2 黑科技集合

3.2.1 Multimap 一个key可以映射多个value的HashMap

Multimap<String, Integer> map = ArrayListMultimap.create();
map.put("key", 1);
map.put("key", 2);
Collection<Integer> values = map.get("key");
System.out.println(map); // 输出 {"key":[1,2]}
// 还能返回你以前使用的臃肿的Map
Map<String, Collection<Integer>> collectionMap = map.asMap();
多省事,多简洁,省得你再创建 Map<String, List>

3.2.1 BiMap 一种连value也不能重复的HashMap

BiMap<String, String> biMap = HashBiMap.create();
// 如果value重复,put方法会抛异常,除非用forcePut方法
biMap.put("key","value");
System.out.println(biMap); // 输出 {"key":"value"}
// 既然value不能重复,何不实现个翻转key/value的方法,已经有了
BiMap<String, String> inverse = biMap.inverse();
System.out.println(inverse); // 输出 {"value":"key"}
这其实是双向映射,在某些场景还是很实用的。

3.2.3 Table 一种有两个key的HashMap

// 一批用户,同时按年龄和性别分组
Table<Integer, String, String> table = HashBasedTable.create();
table.put(18, "男", "yideng");
table.put(18, "女", "Lily");
System.out.println(table.get(18, "男")); // 输出 yideng
// 这其实是一个二维的Map,可以查看行数据
Map<String, String> row = table.row(18);
System.out.println(row); // 输出 {"男":"yideng","女":"Lily"}
// 查看列数据
Map<Integer, String> column = table.column("男");
System.out.println(column); // 输出 {18:"yideng"}

3.2.4 Multiset 一种用来计数的Set

Multiset<String> multiset = HashMultiset.create();
multiset.add("apple");
multiset.add("apple");
multiset.add("orange");
System.out.println(multiset.count("apple")); // 输出 2
// 查看去重的元素
Set<String> set = multiset.elementSet();
System.out.println(set); // 输出 ["orange","apple"]
// 还能查看没有去重的元素
Iterator<String> iterator = multiset.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// 还能手动设置某个元素出现的次数
multiset.setCount("apple", 5);

4.身份证工具类

提供身份证校验器,身份证信息获取方法,身份证号码脱敏方法

package com.utils;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream; /**
* 身份证工具类
* @author songwp
* @create 2023/06/06
*/
public class CardUtil {
private static final int[] COEFFICIENT_ARRAY = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};// 身份证校验码
private static final String[] IDENTITY_MANTISSA = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};// 身份证号的尾数规则
private static final String IDENTITY_PATTERN = "^[0-9]{17}[0-9Xx]$";
/**
* 身份证号码验证
* 1、号码的结构
* 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。从左至右依次为:六位数字地址码,
* 八位数字出生日期码,三位数字顺序码和一位数字校验码。
* 2、地址码(前六位数)
* 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
* 3、出生日期码(第七位至十四位)
* 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
* 4、顺序码(第十五位至十七位)
* 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,
* 顺序码的奇数分配给男性,偶数分配给女性。
* 5、校验码(第十八位数)
* (1)十七位数字本体码加权求和公式 S = Sum(Ai Wi), i = 0, , 16 ,先对前17位数字的权求和 ;
* Ai:表示第i位置上的身份证号码数字值; Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
* (2)计算模 Y = mod(S, 11)
* (3)通过模( 0 1 2 3 4 5 6 7 8 9 10)得到对应的校验码 Y:1 0 X 9 8 7 6 5 4 3 2
*/
public static boolean isLegalPattern(String identity) {
if (identity == null || identity.length() != 18 || !identity.matches(IDENTITY_PATTERN)) {
return false;
}
char[] chars = identity.toCharArray();
long sum = IntStream.range(0, 17).map(index -> {
char ch = chars[index];
int digit = Character.digit(ch, 10);
int coefficient = COEFFICIENT_ARRAY[index];
return digit * coefficient;
}).summaryStatistics().getSum();
// 计算出的尾数索引
int mantissaIndex = (int) (sum % 11);
String mantissa = IDENTITY_MANTISSA[mantissaIndex];
String lastChar = identity.substring(17);
return lastChar.equalsIgnoreCase(mantissa);
} /**
* 通过身份证号码获取 生日,年龄,性别代码
* @param certificateNo 身份证号码
* @return Map
*/
public static Map<String, String> getBirthdayAgeSex(String certificateNo) {
String birthday = "";
String age = "";
String sexCode = "";
int year = Calendar.getInstance().get(Calendar.YEAR);
char[] number = certificateNo.toCharArray();
boolean flag = true;
if (number.length == 15) {
for (int x = 0; x < number.length; x++) {
if (!flag) return new HashMap<String, String>();
flag = Character.isDigit(number[x]);
}
} else if (number.length == 18) {
for (int x = 0; x < number.length - 1; x++) {
if (!flag) return new HashMap<String, String>();
flag = Character.isDigit(number[x]);
}
}
if (flag && certificateNo.length() == 15) {
birthday = "19" + certificateNo.substring(6, 8) + "-"
+ certificateNo.substring(8, 10) + "-"
+ certificateNo.substring(10, 12);
sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 3, certificateNo.length())) % 2 == 0 ? "F" : "M";
age = (year - Integer.parseInt("19" + certificateNo.substring(6, 8))) + "";
} else if (flag && certificateNo.length() == 18) {
birthday = certificateNo.substring(6, 10) + "-"
+ certificateNo.substring(10, 12) + "-"
+ certificateNo.substring(12, 14);
sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 4, certificateNo.length() - 1)) % 2 == 0 ? "F" : "M";
age = (year - Integer.parseInt(certificateNo.substring(6, 10))) + "";
}
Map<String, String> map = new HashMap<String, String>();
map.put("birthday", birthday);
if(ValidateUtil.isEmpty(age)){
map.put("age", "0");
} else {
map.put("age", age);
}
map.put("sexCode", sexCode);
return map;
} /**
* 隐藏身份证某几位
* @param idCard
* @return String
*/
public static String hideIdCard(String idCard){
return idCard = idCard.replaceAll("(\\d{10})\\d{6}(\\d{2})","$1******$2");
}
}

5.手机号码工具类

提供手机号码格式校验器,手机号码脱敏方法

package com.utils;

import org.apache.commons.lang3.StringUtils;
import java.util.regex.Pattern; /**
* 手机号码校验
* @author songwp
* @create 2023/06/06
*/
public class PhoneUtil { /**
* 中国电信号码格式验证 手机段: 133,149,153,173,177,180,181,189,199,1349,1410,1700,1701,1702
**/
private static final String CHINA_TELECOM_PATTERN = "(?:^(?:\\+86)?1(?:33|49|53|7[37]|8[019]|99)\\d{8}$)|(?:^(?:\\+86)?1349\\d{7}$)|(?:^(?:\\+86)?1410\\d{7}$)|(?:^(?:\\+86)?170[0-2]\\d{7}$)"; /**
* 中国联通号码格式验证 手机段:130,131,132,145,146,155,156,166,171,175,176,185,186,1704,1707,1708,1709
**/
private static final String CHINA_UNICOM_PATTERN = "(?:^(?:\\+86)?1(?:3[0-2]|4[56]|5[56]|66|7[156]|8[56])\\d{8}$)|(?:^(?:\\+86)?170[47-9]\\d{7}$)"; /**
* 中国移动号码格式验证
* 手机段:134,135,136,137,138,139,147,148,150,151,152,157,158,159,178,182,183,184,187,188,198,1440,1703,1705,1706
**/
private static final String CHINA_MOBILE_PATTERN = "(?:^(?:\\+86)?1(?:3[4-9]|4[78]|5[0-27-9]|78|8[2-478]|98)\\d{8}$)|(?:^(?:\\+86)?1440\\d{7}$)|(?:^(?:\\+86)?170[356]\\d{7}$)"; /**
* 中国大陆手机号码校验
* @param phone
* @return
*/
public static boolean checkPhone(String phone) {
if (StringUtils.isNotBlank(phone)) {
if (checkChinaMobile(phone) || checkChinaUnicom(phone) || checkChinaTelecom(phone)) {
return true;
}
}
return false;
} /**
* 中国移动手机号码校验
* @param phone
* @return
*/
public static boolean checkChinaMobile(String phone) {
if (StringUtils.isNotBlank(phone)) {
Pattern regexp = Pattern.compile(CHINA_MOBILE_PATTERN);
if (regexp.matcher(phone).matches()) {
return true;
}
}
return false;
} /**
* 中国联通手机号码校验
* @param phone
* @return
*/
public static boolean checkChinaUnicom(String phone) {
if (StringUtils.isNotBlank(phone)) {
Pattern regexp = Pattern.compile(CHINA_UNICOM_PATTERN);
if (regexp.matcher(phone).matches()) {
return true;
}
}
return false;
} /**
* 中国电信手机号码校验
* @param phone
* @return
*/
public static boolean checkChinaTelecom(String phone) {
if (StringUtils.isNotBlank(phone)) {
Pattern regexp = Pattern.compile(CHINA_TELECOM_PATTERN);
if (regexp.matcher(phone).matches()) {
return true;
}
}
return false;
} /**
* 隐藏手机号中间四位
* @param phone
* @return String
*/
public static String hideMiddleMobile(String phone) {
if (StringUtils.isNotBlank(phone)) {
phone = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
return phone;
} /*public static void main(String[] args) {
log.debug(checkPhone("15600000001"));
log.debug(hideMiddleMobile("15600000001"));
}*/ }

6.中文拼音工具类

提供获取中文所有汉字首字母,中文首汉字首字母等方法

package com.utils;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; /**
* 中文拼音工具类
* @author songwp
* @create 2023/06/06
*/
public class PinyinUtil { /**
* 获取第一个汉字的首字母
* @param string
* @return
*/
public static String getPinYinFirstChar(String string) {
if(ValidateUtil.isEmpty(string)){
return "";
}
return getPinYinHeadChar(string).substring(0,1);
} /**
* 获取所有汉字首字母
* @param string
* @return
*/
public static String getPinYinHeadChar(String string) {
StringBuilder convert = new StringBuilder();
for (int j = 0; j < string.length(); j++) {
char word = string.charAt(j);
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
if (pinyinArray != null) {
convert.append(pinyinArray[0].charAt(0));
} else {
convert.append(word);
}
}
return convert.toString().toUpperCase().substring(0,1);
} /**
* 获取汉字的所有大写拼音 eg:NANJINGSHI
* @param name
* @return
* @throws BadHanyuPinyinOutputFormatCombination
*/
public static String getAllUpperCaseChinese(String name) throws BadHanyuPinyinOutputFormatCombination {
char[] charArray = name.toCharArray();
StringBuilder pinyin = new StringBuilder();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);//设置大写格式
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//设置声调格式
for(char c:charArray){
if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {//匹配中文,非中文转换会转换成null
String[] pinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(c,defaultFormat);
pinyin.append(pinyinStringArray[0]);
} else {
pinyin.append(c);
}
}
return pinyin.toString();
} /**
* 获取汉字的所有小写拼音 eg:nanjingshi
* @param name
* @return
* @throws BadHanyuPinyinOutputFormatCombination
*/
public static String getAllLowerCaseChinese(String name) throws BadHanyuPinyinOutputFormatCombination {
char[] charArray = name.toCharArray();
StringBuilder pinyin = new StringBuilder();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);//设置大写格式
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//设置声调格式
for(char c:charArray){
if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {//匹配中文,非中文转换会转换成null
String[] pinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(c,defaultFormat);
pinyin.append(pinyinStringArray[0]);
} else {
pinyin.append(c);
}
}
return pinyin.toString();
} /**
* 获取汉字的所有首字母大写拼音 eg:NJS
* @param name
* @return
* @throws BadHanyuPinyinOutputFormatCombination
*/
public static String getUpperCaseChinese(String name) throws BadHanyuPinyinOutputFormatCombination {
char[] charArray = name.toCharArray();
StringBuilder pinyin = new StringBuilder();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);//设置大小写格式
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//设置声调格式
for(char c:charArray){//匹配中文,非中文转换会转换成null
if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {
String[] hanyuPinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(c, defaultFormat);
if (hanyuPinyinStringArray != null) {
pinyin.append(hanyuPinyinStringArray[0].charAt(0));
}
}
}
return pinyin.toString();
} /**
* 获取汉字的所有首字母小写拼音 eg:njs
* @param name
* @return
* @throws BadHanyuPinyinOutputFormatCombination
*/
public static String getLowerCaseChinese(String name) throws BadHanyuPinyinOutputFormatCombination {
char[] charArray = name.toCharArray();
StringBuilder pinyin = new StringBuilder();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);//设置大小写格式
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);//设置声调格式
for(char c:charArray){//匹配中文,非中文转换会转换成null
if (Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {
String[] hanyuPinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(c, defaultFormat);
if (hanyuPinyinStringArray != null) {
pinyin.append(hanyuPinyinStringArray[0].charAt(0));
}
}
}
return pinyin.toString();
}
}

7.时间工具类

提供时间,字符串转换.时间间隔计算,最大时间,最小时间等

package com.utils;

import com.chang.util.ValidateUtil;
import org.apache.commons.lang.time.DateFormatUtils;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date; /**
* 时间工具类
* @author songwp
* @create 2023/06/06
*/
public class DateUtil { public static String YEAR = "yyyy";
public static String YEARMONTH = "yyyy-MM";
public static String YEARMONTHDAY = "yyyy-MM-dd";
public static String YEARMONTHDAYTIMEBRANCH = "yyyy-MM-dd HH:mm";
public static String YEARMONTHDAYTIMEBRANCHSECOND = "yyyy-MM-dd HH:mm:ss";
public static String YEARMONTHDAYTIMEBRANCHSECONDMILLISECOND = "yyyy-MM-dd HH:mm:ss SSS";
private static long differDay = 1000 * 24 * 60 * 60;
private static long differHour = 1000 * 60 * 60;
private static long differMinute = 1000 * 60;
private static long differSecond = 1000;
public static String DIFFERTIME = "0分钟"; /**
* 获取当前时间戳 yyyy-MM-dd HH:mm:ss
* @return String
*/
public static String getCurrentTime(){
return DateFormatUtils.format(new Date(),YEARMONTHDAYTIMEBRANCHSECOND);
} /**
* 获取年
* @return String
*/
public static String getYear(Date date){
return DateFormatUtils.format(date,YEAR);
} /**
* 获取年月
* @return String
*/
public static String getYearMonth(Date date){
return DateFormatUtils.format(date,YEARMONTH);
} /**
* 获取年月日
* @return String
*/
public static String getYearMonthDay(Date date){
return DateFormatUtils.format(date,YEARMONTHDAY);
} /**
* 获取年月日
* @return String
*/
public static String getYearMonthDayForResult(Date date){
return DateFormatUtils.format(date,"yyyy年MM月dd日");
} /**
* 获取年月日时分
* @return String
*/
public static String getYearMonthDayTimeBranch(Date date){
return DateFormatUtils.format(date,YEARMONTHDAYTIMEBRANCH);
} /**
* 获取年月日时分秒
* @return String
*/
public static String getYearMonthDayTimeBranchSecond(Date date){
return DateFormatUtils.format(date,YEARMONTHDAYTIMEBRANCHSECOND);
} /**
* 获取当月日时分秒毫秒
* @return String
*/
public static String getYearMonthDayTimeBranchSecondMillisecond(Date date){
return DateFormatUtils.format(date,YEARMONTHDAYTIMEBRANCHSECONDMILLISECOND);
} /**
* 将时间转换成固定格式字符串
* @param date 时间
* @param pattern 时间格式
* @return String
*/
public static String getStringByDate(Date date,String pattern) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
LocalDateTime localDateTime = dateToDateTime(date);
return formatter.format(localDateTime);
} /**
* 将字符串转换成固定格式时间 yyyy-MM-dd
* @param string 时间字符串
* @return Date
*/
public static Date getDateByString(String string) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse(string, dateTimeFormatter);
return localDateToDate(localDate);
} /**
* 将字符串转换成固定格式时间 yyyy-MM-dd HH:mm:ss
* @param string 时间字符串
* @return Date
*/
public static Date getDateTimeByString(String string) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(string, dateTimeFormatter);
return dateTimeToDate(localDateTime);
} /**
* 获取某天最小时间
* @param date 时间
* @return Date
*/
public static Date getDateMinTime(Date date) {
LocalDateTime localDateTime = dateToDateTime(date);
localDateTime = localDateTime.with(LocalTime.MIN);
return dateTimeToDate(localDateTime);
} /**
* 获取某天最大时间
* @param date 时间
* @return Date
*/
public static Date getDateMaxTime(Date date) {
LocalDateTime localDateTime = dateToDateTime(date);
localDateTime = localDateTime.with(LocalTime.MAX);
return dateTimeToDate(localDateTime);
} /**
* 获取日期之后的某一天时间
* @param date 时间
* @param days 天数
* @return Date
*/
public static Date getAfterDaysDateTime(Date date, int days) {
LocalDateTime localDateTime = dateToDateTime(date);
localDateTime = localDateTime.plusDays(days);
return dateTimeToDate(localDateTime);
} /**
* 获取日期之前的某一天时间
* @param date 时间
* @param days 天数
* @return Date
*/
public static Date getBeforeDaysDateTime(Date date, int days) {
LocalDateTime localDateTime = dateToDateTime(date);
localDateTime = localDateTime.minusDays(days);
return dateTimeToDate(localDateTime);
} /**
* 获取日期月份第一天 00:00:00 000
* @param date 时间
* @return Date
*/
public static Date getFirstDayOfMonth(Date date) {
LocalDateTime localDateTime = dateToDateTime(date);
localDateTime = localDateTime.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
return dateTimeToDate(localDateTime);
} /**
* 获取日期月份最后一天 23:59:59 999
* @param date 时间
* @return Date
*/
public static Date getLastDayOfMonth(Date date) {
LocalDateTime localDateTime = dateToDateTime(date);
localDateTime = localDateTime.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
return dateTimeToDate(localDateTime);
} /**
* 两个日期相差多少个月
* @param dateBefore 开始时间
* @param dateAfter 结束时间
* @return Long
*/
public static Long getUntilMonthByTwoDate(Date dateBefore, Date dateAfter) {
LocalDate localDate1 = dateToLocalDate(dateBefore);
LocalDate localDate2 = dateToLocalDate(dateAfter);
return ChronoUnit.MONTHS.between(localDate1, localDate2);
} /**
* 两个日期相差多少天
* @param dateBefore 开始时间
* @param dateAfter 结束时间
* @return Long
*/
public static Long getUntilDayByTwoDate(Date dateBefore, Date dateAfter) {
LocalDate localDate1 = dateToLocalDate(dateBefore);
LocalDate localDate2 = dateToLocalDate(dateAfter);
return ChronoUnit.DAYS.between(localDate1, localDate2);
} /**
* 两个日期相差多少小时
* @param dateBefore 开始时间
* @param dateAfter 结束时间
* @return Long
*/
public static Long getUntilHoursByTwoDate(Date dateBefore, Date dateAfter) {
LocalDateTime localDate1 = dateToDateTime(dateBefore);
LocalDateTime localDate2 = dateToDateTime(dateAfter);
Long second = Duration.between(localDate1, localDate2).get(ChronoUnit.SECONDS);
return second / 3600;
} /**
* 两个日期相差多少秒
* @param dateBefore 开始时间
* @param dateAfter 结束时间
* @return Long
*/
public static Long getUntilHoursByTwoSecond(Date dateBefore, Date dateAfter) {
LocalDateTime localDate1 = dateToDateTime(dateBefore);
LocalDateTime localDate2 = dateToDateTime(dateAfter);
return Duration.between(localDate1, localDate2).get(ChronoUnit.SECONDS);
} /**
* LocalDateTime转换为Date
* @param localDateTime 时间
* @return Date
*/
public static Date dateTimeToDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
} /**
* Date转换为LocalDateTime
* @param date 时间
* @return LocalDateTime
*/
public static LocalDateTime dateToDateTime(Date date) {
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
} /**
* Date转换为LocalDate
* @param date 时间
* @return LocalDate
*/
public static LocalDate dateToLocalDate(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} /**
* LocalDate转换为Date
* @param localDate 时间
* @return Date
*/
public static Date localDateToDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
} /**
* 获取增加天数后的日期
* @param date 时间
* @param days 天数
* @return Date
*/
public static Date getAddDay(Date date,Integer days){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, days);
return calendar.getTime();
} /**
* 获取当前时间
* @return Date
*/
public static Date getCurDate() {
return new Date();
} /**
* 获取两个时间相差时间
* @param beforeDate 之前的时间
* @param endDate 之后的时间
* @return String
*/
public static String getStringDateInfoByTwoDate(Date beforeDate,Date endDate) {
long diff = endDate.getTime() - beforeDate.getTime();//获得两个时间的毫秒时间差异
long day = diff / differDay;//计算差多少天
long hour = diff % differDay / differHour;//计算差多少小时
long min = diff % differDay % differHour / differMinute;//计算差多少分钟
long second = diff % differDay % differHour % differMinute / differSecond;//计算差多少秒
String string = "";
if(0 != day){
string = string + day + "天";
}
if(0 != hour){
string = string + hour + "小时";
}
if(0 != min){
string = string + min + "分钟";
}
if(ValidateUtil.isEmpty(string) && second > 0){//差距小于一分钟,计算秒
string = second + "秒";
}
if(ValidateUtil.isEmpty(string)){//没有差距则为0分钟
string = DIFFERTIME;
}
return string;
} /**
* 获取给定年月的最大最小日期
* @param string yyyy-MM
* @param flag true 最小日期 false 最大日期
* @return String
*/
public static String getMonthDayOneAndLast(String string,boolean flag){
Integer year = Integer.parseInt(string.split("-")[0]);
Integer month = Integer.parseInt(string.split("-")[1]);
if(flag){
return DateUtil.getDayByFlagOfMonth(year, month, true);
}
return DateUtil.getDayByFlagOfMonth(year, month, false);
} /**
* 获取给定年月的第一天和最后一天
* @param year 年
* @param month 月
* @param flag true 第一天,false 最后一天
* @return String
*/
public static String getDayByFlagOfMonth(int year,int month,boolean flag){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);//设置年份
calendar.set(Calendar.MONTH, month - 1);//设置月份
if(flag){
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));//设置日历中月份的天数
} else {
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));//设置日历中月份的天数
}
return getYearMonthDay(calendar.getTime());//格式化日期
} /**
* 计算传入时间是否超时
* @param longDate 传入时间
* @param intervalTime 规定时间 秒
* @return boolean
*/
public static boolean isTimeOut(Long longDate,Long intervalTime){
return new Date(System.currentTimeMillis()).getTime() - new Date(longDate).getTime() / 1000 > intervalTime;
} }

Java工具类库大总结的更多相关文章

  1. 国人开源了一款小而全的 Java 工具类库,厉害啊!!

    最近栈长看到了一款小而全的 Java 工具类库:Hutool,Github 已经接近 14K Star 了,想必一定很优秀,现在推荐给大家,很多轮子不要再造了! Hutool 是什么 Hutool 是 ...

  2. Hutool :一个小而全的 Java 工具类库

    Hutool 简介 Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的 ...

  3. 干掉复杂的工具类,国产Java工具类库 Hutool 很香!

    Hutool 大家已经比较熟悉了,这是一个超全的 Java 工具库,深受国内开发者的喜爱. 我之前其实是不太喜欢使用这种功能太多的工具类的,也比较担心稳定性和安全性,后面慢慢接受了就感觉其实也还好.而 ...

  4. 好用的Java工具类库,GitHub星标10k+你在用吗?

    简介 Hutool是Hu + tool的自造词,前者致敬我的"前任公司",后者为工具之意,谐音"糊涂",寓意追求"万事都作糊涂观,无所谓失,无所谓得& ...

  5. hutool JAVA 工具类

    https://hutool.cn/docs/#/ 入门和安装 A set of tools that keep Java sweet. -- 主页:https://hutool.cn/ | http ...

  6. Java程序员常用工具类库 - 目录

    有人说当你开始学习Java的时候,你就走上了一条不归路,在Java世界里,包罗万象,从J2SE,J2ME,J2EE三大平台,到J2EE中的13中核心技术,再到Java世界中万紫千红的Framework ...

  7. Java程序员常用工具类库

    有人说当你开始学习Java的时候,你就走上了一条不归路,在Java世界里,包罗万象,从J2SE,J2ME,J2EE三大平台,到J2EE中的13中核心技术,再到Java世界中万紫千红的Framework ...

  8. Java程序员都应该去使用一下这款强大的国产工具类库

    这不是标题党,今天给大家推荐一个很棒的国产工具类库:Hutool.可能有很多朋友已经知道这个类库了,甚至在已经在使用了,如果你还没有使用过,那不妨去尝试一下,我们项目组目前也在用这个.这篇文章来简单介 ...

  9. 【Java基础】Java开发过程中的常用工具类库

    目录 Java开发过程中的常用工具类库 1. Apache Commons类库 2. Guava类库 3. Spring中的常用工具类 4. 其他工具 参考 Java开发过程中的常用工具类库 1. A ...

  10. Atitit 图像处理类库大总结attilax qc20

    Atitit 图像处理类库大总结attilax qc20 1.1. 选择与组合不同的图像处理类库1 1.2. Halcon 貌似商业工具,功能强大.1 1.3. Openvc  Openvc功能也是比 ...

随机推荐

  1. #SG函数#HDU 1848 Fibonacci again and again

    题目 分析 可取状态只能是斐波那契数,求出SG函数 然后判断三个数sg函数异或和不为0先手必胜 代码 #include <cstdio> #include <cctype> # ...

  2. Python 元组完全指南2

    更新元组 更改元组的值 元组是不可更改的,但有一种变通方法.您可以将元组转换为列表,更改列表,然后将列表转换回元组. 示例: x = ("apple", "banana& ...

  3. Seaborn线性关系数据可视化

    regplot() 绘制两个变量的线性拟合图. sns.regplot( x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci', scat ...

  4. 【FAQ】HarmonyOS SDK 闭源开放能力 —IAP Kit

    1.问题描述 根据https://developer.huawei.com/consumer/cn/doc/harmonyos-references/iap-data-model-0000001736 ...

  5. 携手HMS Core分析服务,以数据助力游戏高效增长

    HMS Core分析服务,以数据助力游戏高效增长,覆盖玩家全生命周期运营场景,与华为应用市场强强联合,玩转智能运营. 了解更多: https://developer.huawei.com/consum ...

  6. JS实现文件转base64

    核心: function file2base64(){ fileAddress = document.getElementById("fileImage").files[0]; f ...

  7. 基于eTS高效开发HarmonyOS课程类应用

    原文:https://mp.weixin.qq.com/s/kU76kB6T1JSqapAfGPGRHQ,点击链接查看更多技术内容. 随着HarmonyOS 3.0 Beta版的发布,API Vers ...

  8. css 去除浮动布局

    前言 在清楚浮动的时候呢,网上有7种,这里只介绍3种,小声哔哔,其他4种都有坑. 正文 第一种: <div class="container"> <div> ...

  9. c# 历史版本特性

    版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual Studio .NET 2002 2002.1 ...

  10. 初接触:从创建工程到导出gerber(学习Altium Designer)

    学习Altium Designer Altium Designer的工程文件后缀为.PrjPcb,主要包含Source Documents和Libraries.Source Documents里面有S ...