枚举类型的日期工具类
优点就是通过枚举型,见明知意的了解输入时间类型与最终转换的字符串格式。
//对已知类型时间字符串进行转义
Date date = null;
try {
date = DateTimeUtils.DATE.parseDate("2022-03-03");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(DateTimeUtils.DATE_CHINESE.formatDate(date));
//对未知类型时间字符串自动获取时间枚举工具类
DateTimeUtils dateTimeUtils = DateTimeUtils.getDateTimeUtil("2022年01月");
String formatDate = dateTimeUtils.formatDate(new Date());
System.out.println(formatDate);
//获取时间月、周第一天或着最后一天 等
final Date weekendOfmonday = DateTimeUtils.getWeekendFirstDayOfMonday(date);
final Date weekendOfSunday = DateTimeUtils.getWeekendFirstDayOfMonday(date);
final Date weekendOfmonday1 = DateTimeUtils.getWeekendFirstDayOfMonday("2022-03-03");
final Date weekendOfSunday1 = DateTimeUtils.getWeekendFirstDayOfSunday("2022-03-03");
final String monday = DateTimeUtils.DATE.formatDate(weekendOfmonday);
final String sunday = DateTimeUtils.DATE.formatDate(weekendOfSunday);
final String monday1 = DateTimeUtils.DATE.formatDate(weekendOfmonday1);
final String sunday1 = DateTimeUtils.DATE.formatDate(weekendOfSunday1);
System.out.println(monday);
System.out.println(sunday);
System.out.println(monday1);
System.out.println(sunday1);
//增加天/月/年
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setYearDate(1)));
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setYearDate(1,weekendOfmonday)));
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setMonthDate(1)));
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setMonthDate(1,weekendOfSunday)));
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setDayDate(1)));
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setDayDate(1,weekendOfmonday1)));
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setDate(1,2,3,new Date())));
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setDate(0,0,-3,new Date())));
//增加时/分/秒
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setTime(1,0,3,weekendOfSunday1)));
System.out.println(DateTimeUtils.DATE.formatDate(DateTimeUtils.setTime(-1,0,0,weekendOfSunday1)));
源码如下:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalQuery;
import java.util.Calendar;
import java.util.Date;
/**
*
* @date 2022年9月29日
* @Description 枚举类型时间工具类
*
*
**/
public enum DateTimeUtils {
/**
* 日期格式 <code>[yyyy-MM-dd]</code>
**/
YEAR("yyyy", 4),
MONTH("MM", 2),
DATE("yyyy-MM-dd", 10),
DATE_FOR_EXCEL("yyyy.MM.dd", 10),
DATE_SLASH("yyyy/MM/dd", 10),
DATE_MONTH_FOR_EXCEL("yyyy-MM", 7),
DATE_MONTH_SLASH_FOR_EXCEL("yyyy/MM", 7),
TIME("HH:mm:ss", 8),
DATE_TIME("yyyy-MM-dd HH:mm:ss", 19),
DATE_TIME_FOR_EXCEL("yyyy.MM.dd HH:mm:ss", 19),
YEAR_CHINESE("yyyy年", 5),
MONTH_CHINESE("MM月", 3),
DATE_MONTH_CHINESE("yyyy年MM月", 8),
DATE_CHINESE("yyyy年MM月dd日", 11),
DATE_TIME_CHINESE("yyyy年MM月dd日 HH时mm分ss秒", 21);
private final DateTimeFormatter formatter;
String pattern;
int len;
DateTimeUtils(String pattern, int len) {
this.pattern = pattern;
this.len = len;
this.formatter = DateTimeFormatter.ofPattern(pattern).withZone(ZoneId.systemDefault());
}
/**
* 获取现在时
*
* @return
*/
public String now() {
return formatter.format(Instant.now());
}
/**
* 转换成时间字符串
*/
public String formatDate(Date date) {
return date != null ? formatter.format(date.toInstant()) : "";
}
public String formatIimestamp(long epochMilli) {
return formatter.format(Instant.ofEpochMilli(epochMilli));
}
private <R> R parse(String date, TemporalQuery<R> query) {
return formatter.parse(date, query);
}
private <R> Date parseDate(String dateStr, TemporalQuery<R> query) {
return Date.from(parseInstant(dateStr, query));
}
private <R> Instant parseInstant(String dateStr, TemporalQuery<R> query) {
R temporal = parse(dateStr, query);
if (temporal instanceof Instant) {
return (Instant) temporal;
}
if (temporal instanceof LocalDateTime) {
return ((LocalDateTime) temporal).atZone(ZoneId.systemDefault()).toInstant();
}
if (temporal instanceof LocalDate) {
return ((LocalDate) temporal).atStartOfDay(ZoneId.systemDefault()).toInstant();
}
if (temporal instanceof LocalDateTime) {
LocalDate epoch = LocalDate.of(1970, 1, 1);
LocalDateTime dateTime = LocalDateTime.of(epoch, (LocalTime) temporal);
return dateTime.atZone(ZoneId.systemDefault()).toInstant();
}
throw new DateTimeException(" Type parameter must be LocalDateTime of LocalDate of LocalTime of Instant ");
}
/**
* 字符串转换成时间
*/
public Date parseDate(String dateStr) throws ParseException {
return new SimpleDateFormat(pattern).parse(dateStr);
}
/**
* 加对应数量的年单位
*/
public static Date setYearDate(int year) {
return setDate(year, 0, 0, null);
}
/**
* 加对应数量的年单位
*/
public static Date setYearDate(int year, Date date) {
return setDate(year, 0, 0, date);
}
/**
* 加对应数量的月单位
*/
public static Date setMonthDate(int month) {
return setDate(0, month, 0, null);
}
/**
* 加对应数量的月单位
*/
public static Date setMonthDate(int month, Date date) {
return setDate(0, month, 0, date);
}
/**
* 加对应数量的天单位
*/
public static Date setDayDate(int day) {
return setDate(0, 0, day, null);
}
/**
* 加对应数量的天单位
*/
public static Date setDayDate(int day, Date date) {
return setDate(0, 0, day, date);
}
/**
* 加对应数量的年月日单位
*/
public static Date setDate(int year, int month, int day, Date date) {
final Calendar instance = Calendar.getInstance();
if (date != null) {
instance.setTime(date);
}
instance.add(Calendar.YEAR, year);
instance.add(Calendar.MONTH, month);
instance.add(Calendar.DATE, day);
return instance.getTime();
}
/**
* 加对应数量的时分秒单位
*/
public static Date setTime(int hour, int minute, int second, Date date) {
final Calendar instance = Calendar.getInstance();
if (date != null) {
instance.setTime(date);
}
instance.add(Calendar.HOUR_OF_DAY, hour);
instance.add(Calendar.MINUTE, minute);
instance.add(Calendar.SECOND, second);
return instance.getTime();
}
public String getPattern() {
return pattern;
}
public int getLen() {
return len;
}
/**
* 获取当周第一天
*
* @param dateStr
* @return
*/
public static Date getFirstDayOfWeek(String dateStr) {
if (dateStr == null || "".equals(dateStr)) {
return null;
}
final DateTimeUtils dateTimeUtil = getDateTimeUtil(dateStr);
if (dateTimeUtil == null) {
return null;
}
try {
final Date date = dateTimeUtil.parseDate(dateStr);
return getFirstDayOfWeek(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取当周第一天
*
* @param date
* @return
*/
public static Date getFirstDayOfWeek(Date date) {
if (date == null) {
return null;
}
final Calendar cal = Calendar.getInstance();
try {
cal.setTime(date);
cal.set(Calendar.DAY_OF_WEEK, 1);
} catch (Exception e) {
e.printStackTrace();
}
return cal.getTime();
}
/**
* 获取当周最后一天
*
* @param dateStr
* @return
*/
public static Date getLastDayOfWeek(String dateStr) {
if (dateStr == null || "".equals(dateStr)) {
return null;
}
final DateTimeUtils dateTimeUtil = getDateTimeUtil(dateStr);
if (dateTimeUtil == null) {
return null;
}
try {
final Date date = dateTimeUtil.parseDate(dateStr);
return getLastDayOfWeek(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取当周最后一天
*
* @param date
* @return
*/
public static Date getLastDayOfWeek(Date date) {
final Calendar cal = Calendar.getInstance();
try {
cal.setTime(date);
cal.set(Calendar.DAY_OF_WEEK, 1);
cal.set(Calendar.DATE, cal.get(Calendar.DATE) + 6);
} catch (Exception e) {
e.printStackTrace();
}
return cal.getTime();
}
/**
* 获取时间枚举工具类
*
* @param dateStr
* @return
*/
public static DateTimeUtils getDateTimeUtil(String dateStr) {
if (null == dateStr) {
return null;
}
DateTimeUtils[] values = DateTimeUtils.values();
for (int i = 0; i < values.length; i++) {
DateTimeUtils dateTimeUtil = values[i];
if (dateTimeUtil.len == dateStr.length() && dateTimeUtil.pattern.charAt(4) == dateStr.charAt(4)) {
return dateTimeUtil;
}
}
return null;
}
/**
* 获取月的最后一天
*
* @return
*/
public static Date getLastDayOfMonth() {
return getLastDayOfMonth(new Date(System.currentTimeMillis()));
}
/**
* 获取月的最后一天
*
* @param date 日期
* @return
*/
public static Date getLastDayOfMonth(Date date) {
final Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.set(Calendar.DAY_OF_MONTH, 1);
instance.roll(Calendar.DAY_OF_MONTH, -1);
return setTime(23, 59, 59, instance.getTime());
}
/**
* 获取月的第一天
*
* @param date 日期
* @return
*/
public static Date getFirstDayOfMonth(Date date) {
final Calendar instance = Calendar.getInstance();
instance.setTime(date);
instance.set(Calendar.DAY_OF_MONTH, 1);
return instance.getTime();
}
public static void main(String[] args) {
}
public static Date getWeekendFirstDayOfMonday(String dateStr) {
if (dateStr == null || "".equals(dateStr)) {
return null;
}
final DateTimeUtils dateTimeUtil = getDateTimeUtil(dateStr);
if (dateTimeUtil == null) {
return null;
}
try {
final Date date = dateTimeUtil.parseDate(dateStr);
return getWeekendFirstDayOfMonday(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 以周日为第一天的获取
* @param date
* @return
*/
public static Date getWeekendFirstDayOfMonday(Date date) {
if (date == null) {
return null;
}
final Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return calendar.getTime();
}
public static Date getWeekendFirstDayOfSunday(String dateStr) {
if (dateStr == null || "".equals(dateStr)) {
return null;
}
final DateTimeUtils dateTimeUtil = getDateTimeUtil(dateStr);
if (dateTimeUtil == null) {
return null;
}
try {
final Date date = dateTimeUtil.parseDate(dateStr);
return getWeekendFirstDayOfSunday(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
public static Date getWeekendFirstDayOfSunday(Date date) {
if (date == null) {
return null;
}
final Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
return calendar.getTime();
}
/**
* 转化成对应的中文内容
*
* @param dateStr
* @param chineseDateTimeUtil
* @return
* @throws ParseException
*/
public static String getDataChineseValue(String dateStr, DateTimeUtils chineseDateTimeUtil) throws ParseException {
String chineseData = "";
if (dateStr == null || "".equals(dateStr)) {
return chineseData;
}
final DateTimeUtils dateTimeUtil = getDateTimeUtil(dateStr);
if (dateTimeUtil == null) {
return chineseData;
}
chineseData = chineseDateTimeUtil.formatDate(dateTimeUtil.parseDate(dateStr));
return chineseData;
}
}