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; // 默认为星期日
|
}
|
}
|
|
|
}
|