mitao
2024-04-30 ab4ea7b8f10c9b66aed9c2ea161a08b25c3851a7
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package com.sinata.common.enums;
 
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 
/**
 * 时间跨度枚举
 *
 * @author frankevil
 * @date 2023/3/28 23:43
 **/
@AllArgsConstructor
@Getter
public enum TimeSpanEnum {
    /**
     * 时间跨度
     */
    TO_DAY("今天", SplitTypeEnum.DAY),
    DAY_7("7天", SplitTypeEnum.DAY),
    DAY_30("30天", SplitTypeEnum.DAY),
    THIS_MONTH("本月", SplitTypeEnum.DAY),
    MONTH_3("近3个月", SplitTypeEnum.MONTH),
    THIS_QUARTERLY("本季度", SplitTypeEnum.MONTH),
    QUARTERLY_1("-季度", SplitTypeEnum.MONTH),
    QUARTERLY_2("二季度", SplitTypeEnum.MONTH),
    QUARTERLY_3("三季度", SplitTypeEnum.MONTH),
    QUARTERLY_4("四季度", SplitTypeEnum.MONTH),
    MONTH_12("近12月", SplitTypeEnum.MONTH),
    THIS_YEAR("本年", SplitTypeEnum.MONTH),
    ;
 
    private final String name;
 
    private final SplitTypeEnum splitType;
 
    @AllArgsConstructor
    @Getter
    public enum SplitTypeEnum {
        /**
         * 类型
         */
        DAY("天", 1, DateField.DAY_OF_YEAR, "YYYY-MM-dd", "%Y-%m-%d"),
        MONTH("月", 1, DateField.MONTH, "YYYY-MM", "%Y-%m"),
        YEAR("年", 1, DateField.YEAR, "YYYY", "%Y"),
        ;
 
        private final String name;
        /**
         * 步长
         */
        private final int step;
        /**
         * 单位
         */
        private final DateField dateField;
        /**
         * 时间显示格式
         */
        private final String format;
 
        /**
         * 数据库时间格式
         */
        private final String sqlFormat;
    }
 
 
    /**
     * 获取时间范围 [0]开始 [1]结束
     *
     * @param timeSpan
     * @return
     */
    public static Date[] getTimeSpan(TimeSpanEnum timeSpan) {
        Date[] result = new Date[2];
        Date now = new Date();
        switch (timeSpan) {
            case TO_DAY:
                result[0] = DateUtil.beginOfDay(now);
                result[1] = DateUtil.endOfDay(now);
                break;
            case DAY_7:
                result[1] = DateUtil.endOfDay(now);
                result[0] = DateUtil.offsetDay(result[1], -7);
                break;
            case DAY_30:
                result[1] = DateUtil.endOfDay(now);
                result[0] = DateUtil.offsetDay(result[1], -30);
                break;
            case THIS_MONTH:
                result[0] = DateUtil.beginOfMonth(now);
                result[1] = DateUtil.endOfMonth(now);
                break;
            case MONTH_3:
                result[1] = DateUtil.endOfDay(now);
                result[0] = DateUtil.offsetMonth(result[1], -3);
                break;
            case THIS_QUARTERLY:
                result[0] = DateUtil.beginOfQuarter(now);
                result[1] = DateUtil.endOfQuarter(now);
                break;
            case QUARTERLY_1:
                result[0] = DateUtil.beginOfYear(now);
                result[1] = DateUtil.endOfMonth(DateUtil.offsetMonth(result[0], 2));
                break;
            case QUARTERLY_2:
                result[0] = DateUtil.offsetMonth(DateUtil.beginOfYear(now), 3);
                result[1] = DateUtil.endOfMonth(DateUtil.offsetMonth(result[0], 2));
                break;
            case QUARTERLY_3:
                result[0] = DateUtil.offsetMonth(DateUtil.beginOfYear(now), 6);
                result[1] = DateUtil.endOfMonth(DateUtil.offsetMonth(result[0], 2));
                break;
            case QUARTERLY_4:
                result[0] = DateUtil.offsetMonth(DateUtil.beginOfYear(now), 9);
                result[1] = DateUtil.endOfMonth(DateUtil.offsetMonth(result[0], 2));
                break;
            case MONTH_12:
                result[1] = DateUtil.endOfDay(now);
                result[0] = DateUtil.offsetMonth(result[1], -12);
                break;
            case THIS_YEAR:
                result[0] = DateUtil.beginOfYear(now);
                result[1] = DateUtil.endOfYear(now);
            default:
                break;
        }
        return result;
    }
 
    /**
     * 获取时间轴
     *
     * @param startTime
     * @param endTime
     * @param splitType
     * @return
     */
    public static List<String> getTimeline(Date startTime, Date endTime, SplitTypeEnum splitType) {
        Date temp = startTime;
        List<String> result = new ArrayList<>();
        do {
            result.add(DateUtil.format(temp, splitType.getFormat()));
            temp = DateUtil.offset(temp, splitType.getDateField(), splitType.getStep());
        } while (DateUtil.compare(temp, endTime) <= 0);
        return result;
    }
 
 
}