吉安感知网项目-后端
xiebin
2026-01-19 4e48664942bbefe70699ca43d25cbbd56ecc8daa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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; // 默认为星期日
        }
    }
 
 
}