概述
在日常的开发中,我们难免会对日期格式化,对日期进行计算,对日期进行校验,为了避免重复写这些琐碎的逻辑,我这里封装了一个日期工具类,方便以后使用,直接复制代码到项目中即可使用。
日期工具类代码:
import org.apache.commons.lang3.StringUtils;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.ZoneId;
import java.util.*;
import java.util.regex.Pattern;
/**
* 常用日期工具类
*
* @author compass
* @date 2022/10/21 14:20
* @since 1.0.0
**/
public class DateTools {
public final static String DEFAULT_TIME_FORMAT = "HH:mm:ss";
public final static String DEFAULT_DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public final static String DEFAULT_DATE_FORMAT_SHORT = "yyMMdd";
public final static String DEFAULT_YEAR_MODTH_SHORT = "yyyyMM";
public final static String DEFAULT_TIME_FORMAT_SHORT = "HHmmss";
public final static String DEFAULT_DATETIME_FORMAT_SHORT = "yyMMddHHmmss";
public final static String DEFAULT_DATE_FORMAT_ALLSHORT = "yyyyMMdd";
public static final String SIMPLE_DATE_STR = "yyyy-MM-dd";
public static final String FULL_DATE_STR = "yyyy-MM-dd HH:mm:ss";
public static final String ALL_FULL_DATE_STR = "yyyy-MM-dd HH:mm:ss.S";
public static final String PART_DATE_STR = "yyyy-MM-dd HH:mm";
public static final String DATEFORMAT_Y2H = "yyyy-MM-dd HH";
public static final String SIMPLE_RULE_DATE_STR = "yyyy/MM/dd";
public static final String FULL_RULE_DATE_STR = "yyyy/MM/dd HH:mm:ss";
public static final String PART_RULE_DATE_STR = "yyyy/MM/dd HH:mm";
public static final String SMALL_PART_RULE_DATE_STR = "HH:mm";
public static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd";
public static final String DATE_FORMAT_YYYYMMDDHH = "yyyyMMddHH";
public static final String DATE_FORMAT_YYYYMMDDHHMM = "yyyyMMddHHmm";
public static final String DATE_FORMAT_YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static final String SIMPLE_POINT_DATE_STR = "yyyy.MM.dd";
public static final String FULL_POINT_DATE_STR = "yyyy.MM.dd HH:mm:ss";
/**
* 锁对象
*/
private static final Object lockObj = new Object();
/**
* 存放不同格式的线程安全的SimpleDateFormat
*/
private static Map> sdfMap = new HashMap();
public enum DateType {
YEAR("YEAR", 1),
MONTH("MONTH", 2),
DAY("DAY", 3),
HOUR("HOUR", 4),
MINUTE("MINUTE", 5),
SECOND("SECOND", 6);
private String name;
private int value;
DateType(String name, int value) {
this.value = value;
this.name = name;
}
public int getValue() {
return value;
}
public String getName() {
return name;
}
}
/**
* 返回一个ThreadLocal的sdf,每个线程只会new一次sdf
*
* @param pattern
* @return
*/
private static SimpleDateFormat getSdf(final String pattern) {
ThreadLocal tl = sdfMap.get(pattern);
if (tl == null) {
synchronized (lockObj) {
tl = sdfMap.get(pattern);
if (tl == null) {
tl = ThreadLocal.withInitial(() -> new SimpleDateFormat(pattern));
sdfMap.put(pattern, tl);
}
}
}
return tl.get();
}
private static String[] supportFmt = new String[]{ALL_FULL_DATE_STR, SIMPLE_DATE_STR,DATE_FORMAT_YYYYMMDDHHMMSS, DEFAULT_YEAR_MODTH_SHORT, DEFAULT_TIME_FORMAT, DEFAULT_DATE_FORMAT_SHORT};
private static String checkFmt(String datestr) {
if (datestr == null)
return null;
int len = datestr.length();
if (len == 0)
return null;
String fmt;
switch (len) {
case 19:
fmt = supportFmt[0];
break;
case 10:
fmt = supportFmt[1];
break;
case 14:
fmt = supportFmt[2];
break;
case 6:
fmt = supportFmt[3];
break;
case 8: {
if (datestr.indexOf(":") > 0) {
fmt = supportFmt[4];
} else {
fmt = supportFmt[5];
}
}
break;
default:
return null;
}
return fmt;
}
/**
* 日期格式,正则表达式
*/
private static String[] supportFmtPattern = new String[]{
"\d{4}\-\d{1,2}\-\d{1,2}", "yyyy-MM-dd",
"\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2}", "yyyy-MM-dd HH:mm:ss",
"\d{1,2}:\d{1,2}:\d{1,2}", "HH:mm:ss",
"\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}", "HH:mm:ss.SSS",
"\d{4}年\d{1,2}月\d{1,2}日", "yyyy年MM月dd日",
"\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}", "yyyy-MM-dd HH:mm:ss.SSS",
"\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])(20|21|22|23|1[0-9]|0[0-9])([1-5][0-9]|0[0-9])([1-5][0-9]|0[0-9])", "yyyyMMddHHmmss",
"\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])", "yyyyMMdd",
"\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])(20|21|22|23|1[0-9]|0[0-9])([1-5][0-9]|0[0-9])([1-5][0-9]|0[0-9])\d{1,3}", "yyyyMMddHHmmssSSS",
"\d{4}(10|11|12|0[1-9])", "yyyyMM",
"\d{4}\/\d{1,2}\/\d{1,2}", "yyyy/MM/dd",
"\d{4}\.\d{1,2}\.\d{1,2}", "yyyy.MM.dd",
"\d{1,2}\-\d{1,2}\-\d{4}", "MM-dd-yyyy",
"\d{1,2}\/\d{1,2}\/\d{4}", "MM/dd/yyyy",
"\d{1,2}\/\d{1,2}\/\d{2}", "MM/dd/yy",
"\d{4}\/\d{1,2}\/\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}", "yyyy/MM/dd'T'HH:mm:ss",
"\d{4}\/\d{1,2}\/\d{1,2}t\d{1,2}:\d{1,2}:\d{1,2}", "yyyy/MM/dd't'HH:mm:ss",
"\d{4}-\d{1,2}-\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}", "yyyy-MM-dd'T'HH:mm:ss",
"\d{4}-\d{1,2}-\d{1,2}t\d{1,2}:\d{1,2}:\d{1,2}", "yyyy-MM-dd't'HH:mm:ss",
"\d{4}\/\d{1,2}\/\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}Z", "yyyy/MM/dd'T'HH:mm:ss.SSS'Z'",
"\d{4}\/\d{1,2}\/\d{1,2}t\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}z", "yyyy/MM/dd't'HH:mm:ss.SSS'z'",
"\d{4}-\d{1,2}-\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}Z", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
"\d{4}-\d{1,2}-\d{1,2}t\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}z", "yyyy-MM-dd't'HH:mm:ss.SSS'z'"
};
/**
* 日期格式,正则表达式
*/
private static String[] supportDateFmtPattern = new String[]{
"\d{4}\-\d{1,2}\-\d{1,2}", "yyyy-MM-dd",
"\d{4}年\d{1,2}月\d{1,2}日", "yyyy年MM月dd日",
"\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])", "yyyyMMdd",
"\d{4}(10|11|12|0[1-9])", "yyyyMM",
"\d{4}\/\d{1,2}\/\d{1,2}", "yyyy/MM/dd",
"\d{4}\.\d{1,2}\.\d{1,2}", "yyyy.MM.dd",
"\d{1,2}\-\d{1,2}\-\d{4}", "MM-dd-yyyy",
"\d{1,2}\/\d{1,2}\/\d{4}", "MM/dd/yyyy",
"\d{1,2}\/\d{1,2}\/\d{2}", "MM/dd/yy"
};
/**
* 时间格式,正则表达式
*/
private static String[] supportTimeFmtPattern = new String[]{
"\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2}", "yyyy-MM-dd HH:mm:ss",
"\d{1,2}:\d{1,2}:\d{1,2}", "HH:mm:ss",
"\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}", "HH:mm:ss.SSS",
"\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}", "yyyy-MM-dd HH:mm:ss.SSS",
"\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])(20|21|22|23|1[0-9]|0[0-9])([1-5][0-9]|0[0-9])([1-5][0-9]|0[0-9])", "yyyyMMddHHmmss",
"\d{4}(10|11|12|0[1-9])(30|31|[1-2][0-9]|0[1-9])(20|21|22|23|1[0-9]|0[0-9])([1-5][0-9]|0[0-9])([1-5][0-9]|0[0-9])\d{1,3}", "yyyyMMddHHmmssSSS",
"\d{4}\/\d{1,2}\/\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}", "yyyy/MM/dd'T'HH:mm:ss",
"\d{4}\/\d{1,2}\/\d{1,2}t\d{1,2}:\d{1,2}:\d{1,2}", "yyyy/MM/dd't'HH:mm:ss",
"\d{4}-\d{1,2}-\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}", "yyyy-MM-dd'T'HH:mm:ss",
"\d{4}-\d{1,2}-\d{1,2}t\d{1,2}:\d{1,2}:\d{1,2}", "yyyy-MM-dd't'HH:mm:ss",
"\d{4}\/\d{1,2}\/\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}Z", "yyyy/MM/dd'T'HH:mm:ss.SSS'Z'",
"\d{4}\/\d{1,2}\/\d{1,2}t\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}z", "yyyy/MM/dd't'HH:mm:ss.SSS'z'",
"\d{4}-\d{1,2}-\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}Z", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
"\d{4}-\d{1,2}-\d{1,2}t\d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3}z", "yyyy-MM-dd't'HH:mm:ss.SSS'z'"
};
/**
* 根据日期时间串推断日期格式
*
* @param datestr 日期字符串
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String checkFmtByPattern(String datestr) {
if (datestr == null)
return null;
for (int i = 0; i
* yyyy-MM-dd HH:mm:ss.SSS
* yyyy-MM-dd HH:mm:ss
* yyyy-MM-dd
* yyyy.MM.dd
* yyyy/MM/dd
* HH:mm:ss.SSS
* HH:mm:ss
* yyyyMMdd
* yyyyMMddHHmmssSSS
* yyyyMMddHHmmss
* yyyyMM
*
* @param datestr
* @return
*/
public static Date parse(String datestr) {
String fmt = checkFmtByPattern(datestr);
return parse(datestr, fmt);
}
/**
* 获取yyyy-MM-dd日期类型
*
* @param dateStr 日期字符串
* @param fmt 日期格式
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date parse(String dateStr, String fmt) {
try {
return getSdf(fmt).parse(dateStr);
} catch (NullPointerException | ParseException e) {
throw new RuntimeException(String.format("不支持的时间格式,[%s]", dateStr));
}
}
/**
* 获取yyyy-MM-dd日期类型
*
* @param datestr 日期字符串
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date parseDay(String datestr) {
try {
return getSdf(supportFmt[1]).parse(datestr);
} catch (ParseException e) {
throw new RuntimeException("不支持的时间格式");
}
}
/**
* 获取yyyy-MM-dd HH:mm:ss日期类型
*
* @param datestr 日期字符串
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static Date parseDayTime(String datestr) {
try {
return getSdf(supportFmt[0]).parse(datestr);
} catch (ParseException e) {
throw new RuntimeException("不支持的时间格式");
}
}
/**
* 将日期格式化成指定格式
*
* @param dt 日期
* @param dt 格式字符串
* @return java.lang.Integer
* @author compass
* @date 2022/10/21 11:06
* @since 1.0.0
**/
public static String format(Date dt, String... pattern) {
if (pattern != null && pattern.length > 1) {
throw new RuntimeException("日期格式字符串,只支持一个");
}
String format = pattern.length 1) {
throw new RuntimeException("日期格式字符串,只支持一个");
}
int days = 0;
try {
SimpleDateFormat myFormatter = new SimpleDateFormat(format.length 1) {
throw new RuntimeException("日期格式字符串,只支持一个");
}
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
return format(new Date(time), format.length = 3600 * 24) {//天
return NumFormat(second / 60 / 60 / 24) + "天" + NumFormat(second / 60 / 60 % 24) + "小时" + NumFormat(second / 60 % 60) + "分";
}
}
return "--";
}
/**
* 获取当前时间前面某天或者后面某天
*
* @param date 日期
* @param amount 相隔天数,正数表示未来日期,负数表示过去日期
* @return java.util.Date
* @author compass
* @date 2022/10/21 14:49
* @since 1.0.0
**/
public static Date getOtherDay(Date date, int amount) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, amount);
Date time = calendar.getTime();
return time;
}
/**
* 获取周几
*
* @param date
* @return
*/
public static String getWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int weekday = calendar.get(Calendar.DAY_OF_WEEK);
String week = null;
if (weekday == 1) {
week = "星期天";
} else if (weekday == 2) {
week = "星期一";
} else if (weekday == 3) {
week = "星期二";
} else if (weekday == 4) {
week = "星期三";
} else if (weekday == 5) {
week = "星期四";
} else if (weekday == 6) {
week = "星期五";
} else if (weekday == 7) {
week = "星期六";
}
return week;
}
/**
* 判断是不是本周
*
* @param date 日期
* @return boolean
* @author compass
* @date 2022/10/21 14:54
* @since 1.0.0
**/
public static boolean isThisWeek(Date date) {
Calendar calendar = Calendar.getInstance();
int currentWeek = calendar.get(Calendar.WEEK_OF_YEAR);
calendar.setTime(date);
int dateWeek = calendar.get(Calendar.WEEK_OF_YEAR);
if (currentWeek == dateWeek) {
return true;
}
return false;
}
/**
* 判断是不是本周
*
* @param date 日期
* @param format 日期格式字符
* @return boolean
* @author compass
* @date 2022/10/21 14:54
* @since 1.0.0
**/
public static boolean isThisWeek(String date, String format) {
Calendar calendar = Calendar.getInstance();
int currentWeek = calendar.get(Calendar.WEEK_OF_YEAR);
calendar.setTime(parse(date, format));
int dateWeek = calendar.get(Calendar.WEEK_OF_YEAR);
if (currentWeek == dateWeek) {
return true;
}
return false;
}
/**
* 判断当前时间
*
* @param date 日期
* @param format 日期格式
* @return boolean
* @author compass
* @date 2022/10/21 15:01
* @since 1.0.0
**/
private static boolean isThisTime(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
String dateFormat = sdf.format(date);
String nowFormat = sdf.format(new Date());
if (dateFormat.equals(nowFormat)) {
return true;
}
return false;
}
/**
* 判断是否是当天
*
* @param date 日期
* @return boolean
* @author compass
* @date 2022/10/21 15:01
* @since 1.0.0
**/
public static boolean isThisDay(Date date) {
return isThisTime(date, "YYYY-MM-dd");
}
/**
* 判断是否是本月
*
* @param date 日期
* @return boolean
* @author compass
* @date 2022/10/21 15:01
* @since 1.0.0
**/
public static boolean isThisMonth(Date date) {
return isThisTime(date, "YYYY-MM-dd");
}
/**
* 获取某月开始时间
*
* @param date 日期
* @return java.time.LocalDateTime
* @author compass
* @date 2022/10/21 16:57
* @since 1.0.0
**/
public static LocalDateTime getMonthBeginTime(Date date) {
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
YearMonth yearMonth = YearMonth.of(localDateTime.getYear(), localDateTime.getMonth());
LocalDate localDate = yearMonth.atDay(1);
return localDate.atStartOfDay();
}
/**
* 获取某月开始时间
*
* @param date 日期字符串
* @return java.time.LocalDateTime
* @author compass
* @date 2022/10/21 16:57
* @since 1.0.0
**/
public static LocalDateTime getMonthBeginTime(String date) {
return getMonthBeginTime(parse(date));
}
/**
* 获取某月结束时间
*
* @param date 日期
* @return java.time.LocalDateTime
* @author compass
* @date 2022/10/21 16:57
* @since 1.0.0
**/
public static LocalDateTime getMonthEndTime(Date date) {
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
YearMonth yearMonth = YearMonth.of(localDateTime.getYear(), localDateTime.getMonth());
LocalDate endOfMonth = yearMonth.atEndOfMonth();
return endOfMonth.atTime(23, 59, 59, 999);
}
/**
* 获取某月结束时间
*
* @param date 日期字符串
* @return java.time.LocalDateTime
* @author compass
* @date 2022/10/21 16:57
* @since 1.0.0
**/
public static LocalDateTime getMonthEndTime(String date) {
return getMonthEndTime(parse(date));
}
/**
* 获取指定时间范围内的所有日期[date]
* @param dBegin 开始日期
* @param dEnd 结束日期
* @return java.util.List
* @author compass
* @date 2022/10/21 17:11
* @since 1.0.0
**/
public static List findBetweenAll(Date dBegin, Date dEnd) {
List dateList = new ArrayList();
Calendar calBegin = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的开始时间
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的结束时间
calEnd.setTime(dEnd);
// 测试此日期是否在指定日期之后
while (dEnd.after(calBegin.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.DAY_OF_MONTH, 1);
dateList.add(calBegin.getTime());
}
return dateList;
}
/**
* 获取指定时间范围内的所有日期[字符串]
* @param dBegin 开始日期
* @param dEnd 结束日期
* @param format 日期格式字符串
* @return java.util.List
* @author compass
* @date 2022/10/21 17:11
* @since 1.0.0
**/
public static List findBetweenAll(String dBegin, String dEnd,String format) {
Date tempEndDate = parse(dEnd);
List dateList = new ArrayList();
Calendar calBegin = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的开始时间
calBegin.setTime(parse(dBegin));
Calendar calEnd = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的结束时间
calEnd.setTime(tempEndDate);
// 测试此日期是否在指定日期之后
while (tempEndDate.after(calBegin.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.DAY_OF_MONTH, 1);
String date = format( calBegin.getTime(),format);
dateList.add(date);
}
return dateList;
}
}
以上就是Java日期工具类的封装详解的详细内容,更多关于Java日期工具类的资料请关注IT俱乐部其它相关文章!
