Ссылка на зависимость pom с открытым исходным кодом:
<dependency>
<groupId>io.github.mingyang66</groupId>
<artifactId>oceansky-date</artifactId>
<version>4.3.2</version>
</dependency>
1. Класс инструмента преобразования даты DateConvertUtils
public class DateConvertUtils {
/**
* 字符串日期格式化
*
* @param str 字符串日期
* @param sourcePattern 原始日期格式
* @param targetPattern 目标格式化格式
* @return 格式化后的日期
*/
public static String format(String str, String sourcePattern, String targetPattern) {
try {
Date date = org.apache.commons.lang3.time.DateUtils.parseDate(str, sourcePattern);
return DateFormatUtils.format(date, targetPattern);
} catch (ParseException e) {
throw new IllegalArgumentException("非法数据");
}
}
/**
* 字符串日期格式化
*
* @param pattern 目标格式化格式
* @return 格式化后的日期
*/
public static String format(Date date, String pattern) {
return DateFormatUtils.format(date, pattern);
}
/**
* 字符串日期格式化
*
* @param str 字符串日期
* @param pattern 原始日期格式
* @return 格式化后的日期
*/
public static Date toDate(String str, String pattern) {
try {
return org.apache.commons.lang3.time.DateUtils.parseDate(str, pattern);
} catch (ParseException e) {
throw new IllegalArgumentException("非法数据");
}
}
/**
* 将LocalDateTime转为Date
*
* @param localDateTime 日期类型
* @return Date日期对象
*/
public static Date toDate(LocalDateTime localDateTime) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* 将LocalDateTime转为Date
*
* @param localDate 日期类型
* @return Date日期对象
*/
public static Date toDate(LocalDate localDate) {
if (localDate == null) {
throw new IllegalArgumentException("非法参数");
}
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
/**
* 将LocalDate转换为LocalDateTime
*
* @param localDate 日期对象
* @return LocalDateTime对象
*/
public static LocalDateTime toLocalDateTime(LocalDate localDate) {
if (localDate == null) {
throw new IllegalArgumentException("非法参数");
}
return localDate.atStartOfDay();
}
/**
* 将Date数据类型转换为LocalDateTime
*
* @param date 日期对象
* @return 转换后的LocalDateTime对象
*/
public static LocalDateTime toLocalDateTime(Date date) {
if (date == null) {
throw new IllegalArgumentException("非法参数");
}
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
/**
* 将字符串日期转换为LocalDateTime对象
*
* @param str 字符串日期
* @param pattern 格式
* @return 日期对象
*/
public static LocalDateTime toLocalDateTime(String str, String pattern) {
if (str == null) {
throw new IllegalArgumentException("非法参数");
}
if (pattern == null) {
throw new IllegalArgumentException("非法参数");
}
return LocalDateTime.parse(str, DateTimeFormatter.ofPattern(pattern));
}
/**
* 将日期对象和时间对象拼接成一个日期对象
*
* @param date1 日期对象
* @param date2 时间对象
* @return 拼接后的时间对象
*/
public static LocalDateTime toLocalDateTime(LocalDate date1, LocalTime date2) {
if (date1 == null) {
throw new IllegalArgumentException("非法参数");
}
if (date2 == null) {
throw new IllegalArgumentException("非法参数");
}
return LocalDateTime.of(date1, date2);
}
/**
* 将指定时间转化为对应时区的时间
* ------------------------------------------------------
* zoneId示例:
* ZoneId ZONE_CN = ZoneId.of("Asia/Shanghai");
* ZoneId ZONE_US = ZoneId.of("US/Eastern")
* ------------------------------------------------------
*
* @param date1 日期对象
* @param zoneId 时区对象
* @return 转换后的日期对象
*/
public static LocalDateTime toLocalDateTime(LocalDateTime date1, ZoneId zoneId) {
if (date1 == null) {
throw new IllegalArgumentException("非法参数");
}
if (zoneId == null) {
zoneId = ZoneId.systemDefault();
}
return date1.atZone(ZoneId.systemDefault()).withZoneSameInstant(zoneId).toLocalDateTime();
}
/**
* 将Date数据类型转换为LocalDate
*
* @param date 日期对象
* @return 转换后的LocalDate对象
*/
public static LocalDate toLocalDate(Date date) {
if (date == null) {
throw new IllegalArgumentException("非法参数");
}
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
/**
* 将LocalDateTime 转 LocalDate
*
* @param localDateTime 日期对象
* @return LocalDate日期对象
*/
public static LocalDate toLocalDate(LocalDateTime localDateTime) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
return localDateTime.toLocalDate();
}
/**
* 将字符串日期转换为LocalDate对象
*
* @param str 字符串日期
* @param pattern 格式
* @return 日期对象
*/
public static LocalDate toLocalDate(String str, String pattern) {
if (str == null) {
throw new IllegalArgumentException("非法参数");
}
if (pattern == null) {
throw new IllegalArgumentException("非法参数");
}
return LocalDate.parse(str, DateTimeFormatter.ofPattern(pattern));
}
/**
* 将Date数据类型转换为LocalDate
*
* @param date 日期对象
* @return 转换后的LocalDate对象
*/
public static LocalTime toLocalTime(Date date) {
if (date == null) {
throw new IllegalArgumentException("非法参数");
}
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
}
/**
* 将LocalDateTime转 LocalTime对象
*
* @param localDateTime 日期对象
* @return LocalTime对象
*/
public static LocalTime toLocalTime(LocalDateTime localDateTime) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
return localDateTime.toLocalTime();
}
/**
* 将字符串日期转换为LocalDate对象
*
* @param str 字符串日期
* @param pattern 格式
* @return 日期对象
*/
public static LocalTime toLocalTime(String str, String pattern) {
if (str == null) {
throw new IllegalArgumentException("非法参数");
}
if (pattern == null) {
throw new IllegalArgumentException("非法参数");
}
return LocalTime.parse(str, DateTimeFormatter.ofPattern(pattern));
}
}
2. Класс инструмента сравнения размера даты DateCompareUtils
public class DateCompareUtils {
/**
* 比较日期大小,firstDate大于等于secondDate 返回true,否则返回false
*
* @param date1 日期字符串
* @param date2 日期字符串
* @param pattern 日期格式
* @return 1:date1>date2、0:date1=date2 -1:date1<date2
*/
public static int compareTo(String date1, String date2, String pattern) {
if (StringUtils.isEmpty(date1) || StringUtils.isEmpty(date2) || StringUtils.isEmpty(pattern)) {
throw new IllegalArgumentException("非法参数");
}
try {
Date first = org.apache.commons.lang3.time.DateUtils.parseDate(date1, pattern);
Date second = org.apache.commons.lang3.time.DateUtils.parseDate(date2, pattern);
return first.compareTo(second);
} catch (ParseException e) {
throw new IllegalArgumentException("非法数据");
}
}
/**
* 比较日期大小,firstDate大于等于secondDate 返回true,否则返回false
*
* @param date1 日期字符串
* @param date2 日期字符串
* @return 1:date1>date2、0:date1=date2 -1:date1<date2
*/
public static int compareTo(Date date1, Date date2) {
if (date1 == null || date2 == null) {
throw new IllegalArgumentException("非法参数");
}
return date1.compareTo(date2);
}
/**
* 日期大小比较
*
* @param date1 日期对象
* @param date2 日期对象
* @return 1:date1>date2、0:date1=date2 -1:date1<date2
*/
public static int compareTo(LocalDateTime date1, LocalDateTime date2) {
if (date1 == null || date2 == null) {
throw new IllegalArgumentException("非法参数");
}
return date1.compareTo(date2);
}
/**
* 日期大小比较
*
* @param date1 日期对象
* @param date2 日期对象
* @return 1:date1>date2、0:date1=date2 -1:date1<date2
*/
public static int compareTo(LocalDate date1, LocalDate date2) {
if (date1 == null || date2 == null) {
throw new IllegalArgumentException("非法参数");
}
return date1.compareTo(date2);
}
/**
* 日期大小比较
*
* @param date1 日期对象
* @param date2 日期对象
* @return 1:date1>date2、0:date1=date2 -1:date1<date2
*/
public static int compareTo(LocalTime date1, LocalTime date2) {
if (date1 == null || date2 == null) {
throw new IllegalArgumentException("非法参数");
}
return date1.compareTo(date2);
}
/**
* Duration对象类型比较大小
*
* @param duration1 日期对象
* @param duration2 日期对象
* @return 1:duration1>duration2,0:duration1=duration2,-1:duration1<duration2
*/
public static int compareTo(Duration duration1, Duration duration2) {
if (duration1 == null || duration2 == null) {
throw new IllegalArgumentException("非法参数");
}
return duration1.compareTo(duration2);
}
}
3. Инструменты для расчета даты DateComputeUtils
public class DateComputeUtils {
/**
* 获取指定日期的月份的第一天
*
* @param localDateTime 日期
* @return 获取指定日期对应的第一天的日期对象
*/
public static LocalDate firstDayOfMonth(LocalDateTime localDateTime) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
return localDateTime.with(TemporalAdjusters.firstDayOfMonth()).toLocalDate();
}
/**
* 获取指定日期的月份的第一天
*
* @param localDateTime 日期
* @param month 向前推 month>0 向后推<0
* @return
*/
public static LocalDate firstDayOfMonth(LocalDateTime localDateTime, int month) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
if (month == 0) {
return localDateTime.with(TemporalAdjusters.firstDayOfMonth()).toLocalDate();
} else if (month < 0) {
return localDateTime.minusMonths(-month).with(TemporalAdjusters.firstDayOfMonth()).toLocalDate();
} else {
return localDateTime.plusMonths(month).with(TemporalAdjusters.firstDayOfMonth()).toLocalDate();
}
}
/**
* 获取指定日期的月份的最后一天
*
* @param localDateTime 日期
* @return
*/
public static LocalDate lastDayOfMonth(LocalDateTime localDateTime) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
return localDateTime.with(TemporalAdjusters.lastDayOfMonth()).toLocalDate();
}
/**
* 获取指定日期的月份的最后一天
*
* @param localDateTime 日期
* @param month 向前推 month>0 向后推<0
* @return
*/
public static LocalDate lastDayOfMonth(LocalDateTime localDateTime, int month) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
if (month == 0) {
return localDateTime.with(TemporalAdjusters.lastDayOfMonth()).toLocalDate();
} else if (month < 0) {
return localDateTime.minusMonths(-month).with(TemporalAdjusters.lastDayOfMonth()).toLocalDate();
} else {
return localDateTime.plusMonths(month).with(TemporalAdjusters.lastDayOfMonth()).toLocalDate();
}
}
/**
* 获取日期所在月份剩余的天数
*
* @param localDateTime 日期
* @return 指定日期所在月份剩余天数
*/
public static int getRemainDayOfMonth(LocalDateTime localDateTime) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
LocalDateTime lastDayOfMonth = localDateTime.with(TemporalAdjusters.lastDayOfMonth());
return lastDayOfMonth.getDayOfMonth() - localDateTime.getDayOfMonth();
}
/**
* 获取指定日期所在年份剩余的天数
*
* @param localDateTime 日期
* @return 指定日期所在年剩余天数
*/
public static int getRemainDayOfYear(LocalDateTime localDateTime) {
if (localDateTime == null) {
throw new IllegalArgumentException("非法参数");
}
LocalDateTime lastDayOfYear = localDateTime.with(TemporalAdjusters.lastDayOfYear());
return lastDayOfYear.getDayOfYear() - localDateTime.getDayOfYear();
}
/**
* 计算两个日期的时间间隔,精度是秒、纳秒
* ---------------------------------------------------------------
* 格式转换
* Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
* Duration fromChar2 = Duration.parse("PT10M");
* 采用ISO-8601时间格式。格式为:PnYnMnDTnHnMnS (n为个数)
* <p>
* 例如:P1Y2M10DT2H30M15.03S
* P:开始标记
* 1Y:一年
* 2M:两个月
* 10D:十天
* T:日期和时间的分割标记
* 2H:两个小时
* 30M:三十分钟
* 15S:15.02秒
* ---------------------------------------------------------------
*
* @param date1, 开始日期
* @param date2 结束日期
* @return date1-date2>0 返回正数,否则返回负数
*/
public static Duration between(Temporal date1, Temporal date2) {
if (date1 == null) {
throw new IllegalArgumentException("非法参数");
}
if (date2 == null) {
throw new IllegalArgumentException("非法参数");
}
return Duration.between(date2, date1);
}
/**
* 计算两个日期的时间间隔,精度为年 月 日
* ---------------------------------------------------------------
* 格式转换:
* "P2Y" -- Period.ofYears(2)
* "P3M" -- Period.ofMonths(3)
* "P4W" -- Period.ofWeeks(4)
* "P5D" -- Period.ofDays(5)
* "P1Y2M3D" -- Period.of(1, 2, 3)
* "P1Y2M3W4D" -- Period.of(1, 2, 25)
* "P-1Y2M" -- Period.of(-1, 2, 0)
* "-P1Y2M" -- Period.of(-1, -2, 0)
* P:开始符,表示period(即:表示年月日);
* Y:year;
* M:month;
* W:week;
* D:day
* ---------------------------------------------------------------
*
* @param date1 日期对象
* @param date2 日期对象
* @return ddate1-date2>0 返回正数,否则返回负数
*/
public static Period between(LocalDate date1, LocalDate date2) {
if (date1 == null) {
throw new IllegalArgumentException("非法参数");
}
if (date2 == null) {
throw new IllegalArgumentException("非法参数");
}
return Period.between(date2, date1);
}
}
Адрес GitHub: https://github.com/mingyang66/spring-parent