|
@@ -8,7 +8,9 @@ import java.time.LocalTime;
|
|
|
import java.time.Month;
|
|
|
import java.time.Period;
|
|
|
import java.time.ZoneId;
|
|
|
+import java.time.ZonedDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.format.DateTimeParseException;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.ArrayList;
|
|
@@ -18,9 +20,15 @@ import java.util.function.Consumer;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+/**
|
|
|
+* 日期时间工具类
|
|
|
+* 提供日期时间常用操作,包括转换、格式化、计算、范围处理等功能
|
|
|
+* @author W.Y.C
|
|
|
+* @date 2025/7/8 14:53
|
|
|
+* @version 1.0
|
|
|
+*/
|
|
|
public class DateUtil {
|
|
|
|
|
|
- // 常用日期格式
|
|
|
public static final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
|
|
|
public static final String NORM_DATE_PATTERN = "yyyy-MM-dd";
|
|
|
public static final String NORM_TIME_PATTERN = "HH:mm:ss";
|
|
@@ -28,8 +36,12 @@ public class DateUtil {
|
|
|
private static final DateTimeFormatter NORM_DATE_FORMAT = DateTimeFormatter.ofPattern(NORM_DATE_PATTERN);
|
|
|
private static final DateTimeFormatter NORM_TIME_FORMAT = DateTimeFormatter.ofPattern(NORM_TIME_PATTERN);
|
|
|
|
|
|
+ // ==================== 基础方法 ====================
|
|
|
+
|
|
|
/**
|
|
|
* 获取当前日期时间
|
|
|
+ *
|
|
|
+ * @return 当前日期时间
|
|
|
*/
|
|
|
public static LocalDateTime now() {
|
|
|
return LocalDateTime.now();
|
|
@@ -37,6 +49,9 @@ public class DateUtil {
|
|
|
|
|
|
/**
|
|
|
* 转换为Date对象
|
|
|
+ *
|
|
|
+ * @param dateTime LocalDateTime对象
|
|
|
+ * @return 对应的Date对象
|
|
|
*/
|
|
|
public static Date toDate(LocalDateTime dateTime) {
|
|
|
return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
|
|
@@ -44,158 +59,451 @@ public class DateUtil {
|
|
|
|
|
|
/**
|
|
|
* 转换为LocalDateTime对象
|
|
|
+ *
|
|
|
+ * @param date Date对象
|
|
|
+ * @return 对应的LocalDateTime对象
|
|
|
*/
|
|
|
public static LocalDateTime toLocalDateTime(Date date) {
|
|
|
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
|
|
|
}
|
|
|
|
|
|
+ // ==================== 格式化与解析 ====================
|
|
|
+
|
|
|
/**
|
|
|
- * 格式化日期时间
|
|
|
- */
|
|
|
- public static String format(Date dateTime, String pattern) {
|
|
|
- return format(toLocalDateTime(dateTime),pattern);
|
|
|
- }
|
|
|
- /**
|
|
|
- * 格式化日期时间
|
|
|
+ * 格式化日期时间(指定模式)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @param pattern 日期格式模式
|
|
|
+ * @return 格式化后的字符串
|
|
|
*/
|
|
|
public static String format(LocalDateTime dateTime, String pattern) {
|
|
|
return dateTime.format(DateTimeFormatter.ofPattern(pattern));
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 格式化日期时间(默认格式:yyyy-MM-dd HH:mm:ss)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 格式化后的字符串
|
|
|
+ */
|
|
|
public static String format(LocalDateTime dateTime) {
|
|
|
return dateTime.format(NORM_DATETIME_FORMAT);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 解析日期时间
|
|
|
+ * 格式化日期时间(Date对象版本)
|
|
|
+ *
|
|
|
+ * @param date Date对象
|
|
|
+ * @param pattern 日期格式模式
|
|
|
+ * @return 格式化后的字符串
|
|
|
+ */
|
|
|
+ public static String format(Date date, String pattern) {
|
|
|
+ return format(toLocalDateTime(date), pattern);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析日期时间(指定模式)
|
|
|
+ *
|
|
|
+ * @param dateStr 日期时间字符串
|
|
|
+ * @param pattern 日期格式模式
|
|
|
+ * @return 解析后的LocalDateTime对象
|
|
|
+ * @throws DateTimeParseException 如果解析失败
|
|
|
*/
|
|
|
public static LocalDateTime parse(String dateStr, String pattern) {
|
|
|
return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 解析日期时间(默认格式:yyyy-MM-dd HH:mm:ss)
|
|
|
+ *
|
|
|
+ * @param dateStr 日期时间字符串
|
|
|
+ * @return 解析后的LocalDateTime对象
|
|
|
+ * @throws DateTimeParseException 如果解析失败
|
|
|
+ */
|
|
|
public static LocalDateTime parse(String dateStr) {
|
|
|
return parse(dateStr, NORM_DATETIME_PATTERN);
|
|
|
}
|
|
|
|
|
|
+ // ==================== 日期加减操作 ====================
|
|
|
+
|
|
|
/**
|
|
|
- * 日期加减
|
|
|
+ * 加年
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param years 要加的年数(可为负数)
|
|
|
+ * @return 计算后的日期时间
|
|
|
*/
|
|
|
public static LocalDateTime addYears(LocalDateTime dateTime, int years) {
|
|
|
return dateTime.plusYears(years);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 减年
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param years 要减的年数
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
+ public static LocalDateTime minusYears(LocalDateTime dateTime, int years) {
|
|
|
+ return dateTime.minusYears(years);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加月
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param months 要加的月数(可为负数)
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
public static LocalDateTime addMonths(LocalDateTime dateTime, int months) {
|
|
|
return dateTime.plusMonths(months);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 减月
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param months 要减的月数
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
+ public static LocalDateTime minusMonths(LocalDateTime dateTime, int months) {
|
|
|
+ return dateTime.minusMonths(months);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加日
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param days 要加的天数(可为负数)
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
public static LocalDateTime addDays(LocalDateTime dateTime, int days) {
|
|
|
return dateTime.plusDays(days);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 减日
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param days 要减的天数
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
+ public static LocalDateTime minusDays(LocalDateTime dateTime, int days) {
|
|
|
+ return dateTime.minusDays(days);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加小时
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param hours 要加的小时数(可为负数)
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
public static LocalDateTime addHours(LocalDateTime dateTime, int hours) {
|
|
|
return dateTime.plusHours(hours);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 减小时
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param hours 要减的小时数
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
+ public static LocalDateTime minusHours(LocalDateTime dateTime, int hours) {
|
|
|
+ return dateTime.minusHours(hours);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加分钟
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param minutes 要加的分钟数(可为负数)
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
public static LocalDateTime addMinutes(LocalDateTime dateTime, int minutes) {
|
|
|
return dateTime.plusMinutes(minutes);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 减分钟
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param minutes 要减的分钟数
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
+ public static LocalDateTime minusMinutes(LocalDateTime dateTime, int minutes) {
|
|
|
+ return dateTime.minusMinutes(minutes);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加秒
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param seconds 要加的秒数(可为负数)
|
|
|
+ * @return 计算后的日期时间
|
|
|
+ */
|
|
|
public static LocalDateTime addSeconds(LocalDateTime dateTime, int seconds) {
|
|
|
return dateTime.plusSeconds(seconds);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 获取日期部分
|
|
|
+ * 减秒
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param seconds 要减的秒数
|
|
|
+ * @return 计算后的日期时间
|
|
|
*/
|
|
|
+ public static LocalDateTime minusSeconds(LocalDateTime dateTime, int seconds) {
|
|
|
+ return dateTime.minusSeconds(seconds);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 日期部分获取 ====================
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取年份
|
|
|
+ *
|
|
|
+ * @param date 日期时间对象
|
|
|
+ * @return 年份
|
|
|
+ */
|
|
|
public static int getYear(Date date) {
|
|
|
return getYear(toLocalDateTime(date));
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取年份
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 年份
|
|
|
+ */
|
|
|
public static int getYear(LocalDateTime dateTime) {
|
|
|
return dateTime.getYear();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取月份枚举
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 月份枚举值
|
|
|
+ */
|
|
|
public static Month getMonth(LocalDateTime dateTime) {
|
|
|
return dateTime.getMonth();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取月份数字(1-12)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 月份数字
|
|
|
+ */
|
|
|
+ public static int getMonthValue(LocalDateTime dateTime) {
|
|
|
+ return dateTime.getMonthValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取当月天数
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 当月天数(1-31)
|
|
|
+ */
|
|
|
public static int getDayOfMonth(LocalDateTime dateTime) {
|
|
|
return dateTime.getDayOfMonth();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取星期枚举
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 星期枚举值
|
|
|
+ */
|
|
|
public static DayOfWeek getDayOfWeek(LocalDateTime dateTime) {
|
|
|
return dateTime.getDayOfWeek();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取小时(24小时制)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 小时(0-23)
|
|
|
+ */
|
|
|
public static int getHour(LocalDateTime dateTime) {
|
|
|
return dateTime.getHour();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取分钟
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 分钟(0-59)
|
|
|
+ */
|
|
|
public static int getMinute(LocalDateTime dateTime) {
|
|
|
return dateTime.getMinute();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取秒
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间对象
|
|
|
+ * @return 秒(0-59)
|
|
|
+ */
|
|
|
public static int getSecond(LocalDateTime dateTime) {
|
|
|
return dateTime.getSecond();
|
|
|
}
|
|
|
|
|
|
+ // ==================== 日期计算 ====================
|
|
|
+
|
|
|
/**
|
|
|
- * 计算日期差
|
|
|
+ * 计算两个日期时间之间的差值
|
|
|
+ *
|
|
|
+ * @param start 开始时间
|
|
|
+ * @param end 结束时间
|
|
|
+ * @param unit 时间单位(ChronoUnit)
|
|
|
+ * @return 时间差值
|
|
|
*/
|
|
|
public static long between(LocalDateTime start, LocalDateTime end, ChronoUnit unit) {
|
|
|
return unit.between(start, end);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 判断日期是否在范围内
|
|
|
- */
|
|
|
- public static boolean isInRange(Date date, Date start, Date end){
|
|
|
- return isInRange(toLocalDateTime(date), toLocalDateTime(start), toLocalDateTime(end));
|
|
|
- }
|
|
|
- /**
|
|
|
- * 判断日期是否在范围内
|
|
|
+ * 判断日期是否在指定范围内
|
|
|
+ *
|
|
|
+ * @param date 待判断日期
|
|
|
+ * @param start 范围开始时间(包含)
|
|
|
+ * @param end 范围结束时间(包含)
|
|
|
+ * @return 是否在范围内
|
|
|
*/
|
|
|
public static boolean isInRange(LocalDateTime date, LocalDateTime start, LocalDateTime end) {
|
|
|
return !date.isBefore(start) && !date.isAfter(end);
|
|
|
}
|
|
|
|
|
|
+ // ==================== 时间范围处理 ====================
|
|
|
+
|
|
|
/**
|
|
|
- * 获取开始时间
|
|
|
+ * 获取日期的开始时间(00:00:00)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当天的开始时间
|
|
|
*/
|
|
|
public static LocalDateTime beginOfDay(LocalDateTime dateTime) {
|
|
|
return dateTime.toLocalDate().atStartOfDay();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取月份的开始时间
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当月第一天 00:00:00
|
|
|
+ */
|
|
|
public static LocalDateTime beginOfMonth(LocalDateTime dateTime) {
|
|
|
return dateTime.withDayOfMonth(1).toLocalDate().atStartOfDay();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取季度的开始时间
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当季度第一天 00:00:00
|
|
|
+ */
|
|
|
+ public static LocalDateTime beginOfQuarter(LocalDateTime dateTime) {
|
|
|
+ int month = dateTime.getMonthValue();
|
|
|
+ int quarterStartMonth = ((month - 1) / 3) * 3 + 1;
|
|
|
+ return dateTime.withMonth(quarterStartMonth).withDayOfMonth(1).toLocalDate().atStartOfDay();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取年份的开始时间
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当年第一天 00:00:00
|
|
|
+ */
|
|
|
public static LocalDateTime beginOfYear(LocalDateTime dateTime) {
|
|
|
return dateTime.withDayOfYear(1).toLocalDate().atStartOfDay();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 获取结束时间
|
|
|
+ * 获取日期当天的结束时间(23:59:59.999999999)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当天的结束时间
|
|
|
*/
|
|
|
public static LocalDateTime endOfDay(LocalDateTime dateTime) {
|
|
|
return dateTime.toLocalDate().atTime(LocalTime.MAX);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取月份结束时间
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当月最后一天 23:59:59.999999999
|
|
|
+ */
|
|
|
public static LocalDateTime endOfMonth(LocalDateTime dateTime) {
|
|
|
return dateTime.with(TemporalAdjusters.lastDayOfMonth()).toLocalDate().atTime(LocalTime.MAX);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取季度结束时间
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当季度最后一天 23:59:59.999999999
|
|
|
+ */
|
|
|
+ public static LocalDateTime endOfQuarter(LocalDateTime dateTime) {
|
|
|
+ int month = dateTime.getMonthValue();
|
|
|
+ int quarterEndMonth = ((month - 1) / 3 + 1) * 3;
|
|
|
+ return dateTime.withMonth(quarterEndMonth)
|
|
|
+ .with(TemporalAdjusters.lastDayOfMonth())
|
|
|
+ .toLocalDate().atTime(LocalTime.MAX);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取年份结束时间
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当年最后一天 23:59:59.999999999
|
|
|
+ */
|
|
|
public static LocalDateTime endOfYear(LocalDateTime dateTime) {
|
|
|
return dateTime.with(TemporalAdjusters.lastDayOfYear()).toLocalDate().atTime(LocalTime.MAX);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 生成日期范围
|
|
|
+ * 获取周的开始时间(周一)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当周周一 00:00:00
|
|
|
+ */
|
|
|
+ public static LocalDateTime beginOfWeek(LocalDateTime dateTime) {
|
|
|
+ return dateTime.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))
|
|
|
+ .toLocalDate().atStartOfDay();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取周的结束时间(周日)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当周周日 23:59:59.999999999
|
|
|
+ */
|
|
|
+ public static LocalDateTime endOfWeek(LocalDateTime dateTime) {
|
|
|
+ return dateTime.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY))
|
|
|
+ .toLocalDate().atTime(LocalTime.MAX);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 日期范围生成 ====================
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成日期范围列表
|
|
|
+ *
|
|
|
+ * @param start 开始时间(包含)
|
|
|
+ * @param end 结束时间(包含)
|
|
|
+ * @param unit 时间单位
|
|
|
+ * @return 日期时间列表
|
|
|
*/
|
|
|
public static List<LocalDateTime> range(LocalDateTime start, LocalDateTime end, ChronoUnit unit) {
|
|
|
+ if (start.isAfter(end)) {
|
|
|
+ throw new IllegalArgumentException("Start must be before end");
|
|
|
+ }
|
|
|
+
|
|
|
List<LocalDateTime> result = new ArrayList<>();
|
|
|
long distance = unit.between(start, end);
|
|
|
-
|
|
|
+
|
|
|
for (long i = 0; i <= distance; i++) {
|
|
|
result.add(start.plus(i, unit));
|
|
|
}
|
|
@@ -203,120 +511,184 @@ public class DateUtil {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 日期范围处理
|
|
|
+ * 日期范围转换处理
|
|
|
+ *
|
|
|
+ * @param <T> 返回类型
|
|
|
+ * @param start 开始时间
|
|
|
+ * @param end 结束时间
|
|
|
+ * @param unit 时间单位
|
|
|
+ * @param func 转换函数
|
|
|
+ * @return 转换后的结果列表
|
|
|
*/
|
|
|
public static <T> List<T> rangeFunc(LocalDateTime start, LocalDateTime end, ChronoUnit unit, Function<LocalDateTime, T> func) {
|
|
|
return range(start, end, unit).stream().map(func).collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 日期范围消费处理
|
|
|
+ *
|
|
|
+ * @param start 开始时间
|
|
|
+ * @param end 结束时间
|
|
|
+ * @param unit 时间单位
|
|
|
+ * @param consumer 消费函数
|
|
|
+ */
|
|
|
public static void rangeConsume(LocalDateTime start, LocalDateTime end, ChronoUnit unit, Consumer<LocalDateTime> consumer) {
|
|
|
range(start, end, unit).forEach(consumer);
|
|
|
}
|
|
|
|
|
|
+ // ==================== 特殊日期判断 ====================
|
|
|
+
|
|
|
/**
|
|
|
- * 判断是否闰年
|
|
|
+ * 判断是否为闰年
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 是否为闰年
|
|
|
*/
|
|
|
public static boolean isLeapYear(LocalDateTime dateTime) {
|
|
|
return dateTime.toLocalDate().isLeapYear();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 时间戳转换
|
|
|
+ * 判断是否为周末(周六或周日)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 是否为周末
|
|
|
+ */
|
|
|
+ public static boolean isWeekend(LocalDateTime dateTime) {
|
|
|
+ DayOfWeek day = dateTime.getDayOfWeek();
|
|
|
+ return day == DayOfWeek.SATURDAY || day == DayOfWeek.SUNDAY;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否为工作日(周一到周五)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 是否为工作日
|
|
|
+ */
|
|
|
+ public static boolean isWorkday(LocalDateTime dateTime) {
|
|
|
+ return !isWeekend(dateTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ==================== 时间戳操作 ====================
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 时间戳转LocalDateTime
|
|
|
+ *
|
|
|
+ * @param timestamp 毫秒时间戳
|
|
|
+ * @return 对应的日期时间
|
|
|
*/
|
|
|
public static LocalDateTime fromTimestamp(long timestamp) {
|
|
|
return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault());
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 日期时间转时间戳(毫秒)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 毫秒时间戳
|
|
|
+ */
|
|
|
public static long toTimestamp(LocalDateTime dateTime) {
|
|
|
return dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
|
|
|
}
|
|
|
|
|
|
+ // ==================== 时区转换 ====================
|
|
|
+
|
|
|
/**
|
|
|
* 时区转换
|
|
|
+ *
|
|
|
+ * @param dateTime 原始日期时间
|
|
|
+ * @param targetZone 目标时区
|
|
|
+ * @return 目标时区的日期时间
|
|
|
*/
|
|
|
public static LocalDateTime convertTimeZone(LocalDateTime dateTime, ZoneId targetZone) {
|
|
|
- return dateTime.atZone(ZoneId.systemDefault()).withZoneSameInstant(targetZone).toLocalDateTime();
|
|
|
+ ZonedDateTime zoned = dateTime.atZone(ZoneId.systemDefault());
|
|
|
+ return zoned.withZoneSameInstant(targetZone).toLocalDateTime();
|
|
|
}
|
|
|
|
|
|
+ // ==================== 日期比较 ====================
|
|
|
+
|
|
|
/**
|
|
|
- * 比较日期
|
|
|
+ * 比较两个日期时间
|
|
|
+ *
|
|
|
+ * @param dt1 日期时间1
|
|
|
+ * @param dt2 日期时间2
|
|
|
+ * @return 比较结果(负数:dt1 < dt2,0:相等,正数:dt1 > dt2)
|
|
|
*/
|
|
|
public static int compare(LocalDateTime dt1, LocalDateTime dt2) {
|
|
|
return dt1.compareTo(dt2);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 判断同一天
|
|
|
+ * 判断是否为同一天
|
|
|
+ *
|
|
|
+ * @param dt1 日期时间1
|
|
|
+ * @param dt2 日期时间2
|
|
|
+ * @return 是否同一天
|
|
|
*/
|
|
|
public static boolean isSameDay(LocalDateTime dt1, LocalDateTime dt2) {
|
|
|
return dt1.toLocalDate().equals(dt2.toLocalDate());
|
|
|
}
|
|
|
|
|
|
+ // ==================== 实用功能 ====================
|
|
|
+
|
|
|
/**
|
|
|
- * 年龄计算
|
|
|
+ * 计算年龄
|
|
|
+ *
|
|
|
+ * @param birthDate 出生日期
|
|
|
+ * @return 年龄(周岁)
|
|
|
*/
|
|
|
public static int calculateAge(LocalDate birthDate) {
|
|
|
return Period.between(birthDate, LocalDate.now()).getYears();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 时间段是否重叠
|
|
|
+ * 判断两个时间段是否重叠
|
|
|
+ *
|
|
|
+ * @param start1 时间段1开始
|
|
|
+ * @param end1 时间段1结束
|
|
|
+ * @param start2 时间段2开始
|
|
|
+ * @param end2 时间段2结束
|
|
|
+ * @return 是否重叠
|
|
|
*/
|
|
|
public static boolean isOverlap(
|
|
|
- LocalDateTime start1, LocalDateTime end1,
|
|
|
- LocalDateTime start2, LocalDateTime end2
|
|
|
+ LocalDateTime start1, LocalDateTime end1,
|
|
|
+ LocalDateTime start2, LocalDateTime end2
|
|
|
) {
|
|
|
return !start1.isAfter(end2) && !start2.isAfter(end1);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 季度处理
|
|
|
+ * 获取季度(1-4)
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 所属季度
|
|
|
*/
|
|
|
public static int getQuarter(LocalDateTime dateTime) {
|
|
|
return (dateTime.getMonthValue() - 1) / 3 + 1;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 星座计算
|
|
|
- */
|
|
|
- public static String getZodiac(LocalDateTime dateTime) {
|
|
|
- int month = dateTime.getMonthValue();
|
|
|
- int day = dateTime.getDayOfMonth();
|
|
|
-
|
|
|
- if ((month == 3 && day >= 21) || (month == 4 && day <= 19)) {return "白羊座";};
|
|
|
- if ((month == 4 && day >= 20) || (month == 5 && day <= 20)) {return "金牛座";};
|
|
|
- if ((month == 5 && day >= 21) || (month == 6 && day <= 21)) {return "双子座";};
|
|
|
- if ((month == 6 && day >= 22) || (month == 7 && day <= 22)) {return "巨蟹座";};
|
|
|
- if ((month == 7 && day >= 23) || (month == 8 && day <= 22)) {return "狮子座";};
|
|
|
- if ((month == 8 && day >= 23) || (month == 9 && day <= 22)) {return "处女座";};
|
|
|
- if ((month == 9 && day >= 23) || (month == 10 && day <= 23)) {return "天秤座";};
|
|
|
- if ((month == 10 && day >= 24) || (month == 11 && day <= 22)) {return "天蝎座";};
|
|
|
- if ((month == 11 && day >= 23) || (month == 12 && day <= 21)) {return "射手座";};
|
|
|
- if ((month == 12 && day >= 22) || (month == 1 && day <= 19)) {return "摩羯座";};
|
|
|
- if ((month == 1 && day >= 20) || (month == 2 && day <= 18)) {return "水瓶座";};
|
|
|
- return "双鱼座";
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 生肖计算
|
|
|
- */
|
|
|
- public static String getChineseZodiac(LocalDateTime dateTime) {
|
|
|
- String[] zodiacs = {"猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊"};
|
|
|
- return zodiacs[dateTime.getYear() % 12];
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 工作日计算
|
|
|
- */
|
|
|
- public static boolean isWorkday(LocalDateTime dateTime) {
|
|
|
- return dateTime.getDayOfWeek().getValue() < 6;
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* 获取月末最后一天
|
|
|
+ *
|
|
|
+ * @param dateTime 日期时间
|
|
|
+ * @return 当月最后一天
|
|
|
*/
|
|
|
public static int lastDayOfMonth(LocalDateTime dateTime) {
|
|
|
return dateTime.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取下一个工作日(跳过周末)
|
|
|
+ *
|
|
|
+ * @param dateTime 起始日期
|
|
|
+ * @return 下一个工作日
|
|
|
+ */
|
|
|
+ public static LocalDateTime nextWorkday(LocalDateTime dateTime) {
|
|
|
+ LocalDateTime result = dateTime.plusDays(1);
|
|
|
+ while (isWeekend(result)) {
|
|
|
+ result = result.plusDays(1);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|