package org.sxkj.common.utils; import org.sxkj.common.enums.DateEnum; import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; public class DateUtils { /** * 判断两个时间是否跨日、跨月或跨年 * @param start 开始时间 * @param end 结束时间 * @return 返回跨日、跨月或跨年的枚举值 */ public static DateEnum compareDate(LocalDateTime start, LocalDateTime end) { if (start.getYear() != end.getYear()) { return DateEnum.YEARS; } else if (start.getMonthValue() != end.getMonthValue()) { return DateEnum.MONTHS; } else if (start.getDayOfYear() != end.getDayOfYear()) { return DateEnum.DAYS; } else { return DateEnum.DAYS; } } /** * 计算年度周期边界 * @param maintainTime 维护时间 * @param ruleMonth 规则月份 * @param ruleDay 规则日期 * @return 周期边界 [start, end] */ public static LocalDateTime[] calculateAnnualCycle(Date maintainTime, int ruleMonth, int ruleDay) { LocalDateTime maintainDateTime = maintainTime.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); LocalDateTime currentYearStart = LocalDateTime.of( maintainDateTime.getYear(), ruleMonth, ruleDay, 0, 0, 0); LocalDateTime currentYearEnd = LocalDateTime.of( maintainDateTime.getYear() + 1, ruleMonth, ruleDay, 0, 0, 0); // 如果当前年份的规则日期已经过去,则使用下一年的周期 if (maintainDateTime.isBefore(currentYearStart)) { currentYearStart = currentYearStart.minusYears(1); currentYearEnd = currentYearEnd.minusYears(1); } return new LocalDateTime[]{currentYearStart, currentYearEnd}; } /** * 计算月度周期边界 * @param maintainTime 维护时间 * @param ruleDay 规则日期 * @return 周期边界 [start, end] */ public static LocalDateTime[] calculateMonthlyCycle(Date maintainTime, int ruleDay) { LocalDateTime maintainDateTime = maintainTime.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); LocalDateTime currentMonthStart = LocalDateTime.of( maintainDateTime.getYear(), maintainDateTime.getMonthValue(), ruleDay, 0, 0, 0); LocalDateTime currentMonthEnd = currentMonthStart.plusMonths(1); // 如果当前月份的规则日期已经过去,则使用下个月的周期 if (maintainDateTime.isBefore(currentMonthStart)) { currentMonthStart = currentMonthStart.minusMonths(1); currentMonthEnd = currentMonthEnd.minusMonths(1); } return new LocalDateTime[]{currentMonthStart, currentMonthEnd}; } /** * 计算周度周期边界 * @param maintainTime 维护时间 * @param ruleDayOfWeek 规则星期几(1-7) * @return 周期边界 [start, end] */ public static LocalDateTime[] calculateWeeklyCycle(Date maintainTime, int ruleDayOfWeek) { LocalDateTime maintainDateTime = maintainTime.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); DayOfWeek currentDayOfWeek = maintainDateTime.getDayOfWeek(); int daysDiff = currentDayOfWeek.getValue() - ruleDayOfWeek; if (daysDiff < 0) daysDiff += 7; // 确保差值为正 LocalDateTime weekStart = maintainDateTime.minusDays(daysDiff); LocalDateTime weekEnd = weekStart.plusWeeks(1); return new LocalDateTime[]{weekStart, weekEnd}; } /** * 判断维护时间是否在周期内 * @param maintainTime 维护时间 * @param cycleStart 周期开始时间 * @param cycleEnd 周期结束时间 * @return 是否在周期内 */ public static boolean isMaintainTimeInCycle(Date maintainTime, LocalDateTime cycleStart, LocalDateTime cycleEnd) { LocalDateTime maintainDateTime = maintainTime.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); return !maintainDateTime.isBefore(cycleStart) && maintainDateTime.isBefore(cycleEnd); } /** * 获取星期几的数字表示 * @param weekday 星期几字符串 * @return 数字表示(1-7) */ public static int getDayOfWeekNumber(String weekday) { switch (weekday) { case "星期日": return 1; case "星期一": return 2; case "星期二": return 3; case "星期三": return 4; case "星期四": return 5; case "星期五": return 6; case "星期六": return 7; default: return 1; // 默认为星期日 } } }