본문 바로가기
JAVA

[Java] 날짜 사이의 기간 데이터 구하는 방법

by GoodDayDeveloper 2024. 2. 2.
반응형

 

 

자바로 통계 프로그램을 구현할때 기간 데이터가 필요합니다.

 

만약 검색창에 2023-04-01일과 2023-04-08일을 입력하게 된다면 

 

검색한 두 날짜의 기간 데이터를 구하여 통계 데이터에 활용하는 방법이 필요한 거죠.

 

이래야 가장 중요한 쿼리 결과의 없는 날짜을 0값으로 채워 활용할 수가 있습니다.

 

 

 

여기서 일자별 / 주별 / 월별 / 분기별 / 년도별을 구분할 수 있는 코드를 준비해보았습니다.

(변수 타입값 : DAY, WEEK, MONTH, QTR, YEAR)

 

타입별로 각각 설명과 전체 코드를 정리하니 잘 활용하시면 될 것 같습니다!

 

 

 

 

 

[Java] 날짜 사이의 기간 데이터 구하는 방법

 

 

 

 

 

일자별 

 

 

 

시작일:2023-04-01    종료일: 2023-04-08    일 경우

 

배열값 :

2023-04-01

2023-04-02

2023-04-03

2023-04-04

2023-04-05

2023-04-06

2023-04-07

2023-04-08

 

 

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
public List<String> dateBetween (String stDate, String etDate, String type){
    
    List<String> dates = new ArrayList<String>();
    
    String sDate = stDate.replace("-""");
    String eDate = etDate.replace("-""");
    
    
    if (type.equals("DAY")) {
        
        String inputStartDate = stDate;
        String inputEndDate = etDate;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = null;
        Date endDate = null;
        try {
            startDate = sdf.parse(inputStartDate);
            endDate = sdf.parse(inputEndDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        
        Date currentDate = startDate;
        while (currentDate.compareTo(endDate) <= 0) {
            dates.add(sdf.format(currentDate));
            Calendar c = Calendar.getInstance();
            c.setTime(currentDate);
            c.add(Calendar.DAY_OF_MONTH, 1);
            currentDate = c.getTime();
        }
        
    } 
    
    return dates;
}
cs

 

 

공통적으로 시작일과 종료일을 replace를 하여 하이픈(-)을 공백표시해줍니다.

 

그 다음 Date타입으로 변환한 뒤에,

 

while 문으로 비교를하여 종료날짜보다 작으면 배열에 하나씩 담아주는 형태입니다.

 

그리고 날짜를 하나 더해서 종료날짜가 될때까지 배열에 담아주고 있습니다.

 

 

 

 

주별

 

 

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
public List<String> dateBetween (String stDate, String etDate, String type){
    
    List<String> dates = new ArrayList<String>();
    
    String sDate = stDate.replace("-""");
    String eDate = etDate.replace("-""");
 
        
    int sYear = Integer.parseInt(sDate.substring(04));
    int sMonth = Integer.parseInt(sDate.substring(46));
    int sWeek = getWeekOfYear(stDate);
 
    int eYear = Integer.parseInt(eDate.substring(04));
    int eMonth = Integer.parseInt(eDate.substring(46));
    int eWeek = getWeekOfYear(etDate);
    
    int diff = 0;
    int num = 0;
    
    if (type.equals("WEEK")) {                
        diff = (eYear - sYear) * 52 + (eWeek - sWeek + 1); 
        num = sWeek;
 
        for (int k = 1; k <= diff; k++) {
            dates.add(sYear + "-" + sWeek);
 
            if (num == 52) {
                sYear++;
                num = 0;
                sWeek = 1;
            } else {
                sWeek++;
            }
            num++;
        }
    }
        
    
    return dates;
}
 
public int getWeekData(String date) {    
    Calendar calendar = Calendar.getInstance();   
    String[] dates = date.split("-");    
    int year = Integer.parseInt(dates[0]);    
    int month = Integer.parseInt(dates[1]);    
    int day = Integer.parseInt(dates[2]);    
    calendar.set(year, month - 1, day);    
    return calendar.get(Calendar.WEEK_OF_YEAR);
}
cs

 

 

gewWeeData에서 주차 데이터를 넣은 다음에

 

종료값과 시작값의 차이를 반복해서 52주 기준으로 반복하면서 

 

dates 배열에 넣어줍니다.

 

 

 

 

 

 

월별

 

 

시작일:2023-01-01    종료일: 2023-05-31    일 경우

 

배열값 :

2023-01

2023-02

2023-03

2023-04

2023-05

 

 

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
public List<String> dateBetween (String stDate, String etDate, String type){
    
    List<String> dates = new ArrayList<String>();
    
    String sDate = stDate.replace("-""");
    String eDate = etDate.replace("-""");
 
        
    int sYear = Integer.parseInt(sDate.substring(04));
    int sMonth = Integer.parseInt(sDate.substring(46));
 
    int eYear = Integer.parseInt(eDate.substring(04));
    int eMonth = Integer.parseInt(eDate.substring(46));
    
    int diff = 0;
    int num = 0;
    
    if (type.equals("MONTH")) {
        diff = (eYear - sYear) * 12 + (eMonth - sMonth + 1); // 두 날짜의 월수 차이
        num = sMonth;
 
        for (int k = 1; k <= diff; k++) {
            if (num > 9) {
                dates.add(sYear + "-" + sMonth);
            } else if (num <= 9) {
                dates.add(sYear + "-0" + sMonth);
            }
 
            if (num == 12) {
                sYear++;
                num = 0;
                sMonth = 1;
            } else {
                sMonth++;
            }
 
            num++;
        }
        
    }    
 
    return dates;
}
cs

 

 

필요한 데이터인 시작일자의 년도와 월 / 종료일자의 년도와 월을 구한 다음,

 

두 날짜의 월수 차이를 구해줍니다.

 

그리고 차이를 반복하면서 배열에 담아주면 됩니다.

 

 

 

반응형

 

 

분기별

 

 

시작일:2022-01-01    종료일: 2022-12-31    일 경우

 

배열값 :

2022_1Q

2022_2Q

2022_3Q

2022_4Q

 

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
public List<String> dateBetween (String stDate, String etDate, String type){
    
    List<String> dates = new ArrayList<String>();
    
    String sDate = stDate.replace("-""");
    String eDate = etDate.replace("-""");
 
        
    int sYear = Integer.parseInt(sDate.substring(04));
    int sMonth = Integer.parseInt(sDate.substring(46));
 
    int eYear = Integer.parseInt(eDate.substring(04));
    int eMonth = Integer.parseInt(eDate.substring(46));
    
    int diff = 0;
    int num = 0;
    
    if (type.equals("QTR")) {
        
        diff = (eYear - sYear) * 12 + (eMonth - sMonth + 1); // 두 날짜의 월수 차이
        num = sMonth;
 
        ArrayList<String> dmap = new ArrayList<String>();
        for (int k = 1; k <= diff; k++) {
            dmap.add(sYear + "_" + (int) Math.ceil(sMonth / 3.0)+ "Q");
 
            if (num == 12) {
                sYear++;
                num = 0;
                sMonth = 1;
            } else {
                sMonth++;
            }
 
            num++;
        }
 
        for (int i = 0; i < dmap.size(); i++) {
            if (!dates.contains(dmap.get(i))) {
                dates.add(dmap.get(i));
            }
        }
        
    } 
    
    return dates;
}
cs

 

분기 또한 월별과 비슷하게 두 날짜의 월수 차이를 계산해줍니다.

 

그리고 그 차이만큼 반복하면서 임시배열인 dmap에 담아주고

 

임시배열의 길이만큼 반복하면서 배열에 담아줍니다.

 

 

 

 

 

 

 

 

년도별

 

 

 

시작일:2021-05-01    종료일: 2023-05-31    일 경우

 

배열값 :

 

2021

2022

2023

 

 

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
public List<String> dateBetween (String stDate, String etDate, String type){
    
    List<String> dates = new ArrayList<String>();
    
    String sDate = stDate.replace("-""");
    String eDate = etDate.replace("-""");
 
        
    int sYear = Integer.parseInt(sDate.substring(04));
    int sMonth = Integer.parseInt(sDate.substring(46));
 
    int eYear = Integer.parseInt(eDate.substring(04));
    int eMonth = Integer.parseInt(eDate.substring(46));
    
    int diff = 0;
    int num = 0;
    
    if (type.equals("YEAR")) {
        diff = (eYear - sYear) == 0 ? 1 : ((eYear - sYear) + 1);
 
        for (int k = 1; k <= diff; k++) {
            dates.add(String.valueOf(sYear));
            sYear++;
        }
    }
        
    
    return dates;
}
cs

 

 

마지막 년도별 계산은 간단합니다.

 

이곳 역시 년도별 차이를 삼항연산자로 계산해준 다음,

 

차이를 반복하면서 배열에 넣어주기만 하면 됩니다!

 

 

 

 

 

 

전체코드

 

 

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
public List<String> dateBetween (String stDate, String etDate, String type){
        
    List<String> dates = new ArrayList<String>();
    
    String sDate = stDate.replace("-""");
    String eDate = etDate.replace("-""");
    
    
    if (type.equals("DAY")) {
        
        String inputStartDate = stDate;
        String inputEndDate = etDate;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date startDate = null;
        Date endDate = null;
        try {
            startDate = sdf.parse(inputStartDate);
            endDate = sdf.parse(inputEndDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        
        Date currentDate = startDate;
        while (currentDate.compareTo(endDate) <= 0) {
            dates.add(sdf.format(currentDate));
            Calendar c = Calendar.getInstance();
            c.setTime(currentDate);
            c.add(Calendar.DAY_OF_MONTH, 1);
            currentDate = c.getTime();
        }
        
    } else {
        
        int sYear = Integer.parseInt(sDate.substring(04));
        int sMonth = Integer.parseInt(sDate.substring(46));
        int sWeek = getWeekOfYear(stDate);
 
        int eYear = Integer.parseInt(eDate.substring(04));
        int eMonth = Integer.parseInt(eDate.substring(46));
        int eWeek = getWeekOfYear(etDate);
        
        int diff = 0;
        int num = 0;
        
        if (type.equals("MONTH")) {
            diff = (eYear - sYear) * 12 + (eMonth - sMonth + 1); 
            num = sMonth;
 
            for (int k = 1; k <= diff; k++) {
                if (num > 9) {
                    dates.add(sYear + "-" + sMonth);
                } else if (num <= 9) {
                    dates.add(sYear + "-0" + sMonth);
                }
 
                if (num == 12) {
                    sYear++;
                    num = 0;
                    sMonth = 1;
                } else {
                    sMonth++;
                }
 
                num++;
            }
            
        } else if (type.equals("QTR")) {
            
            diff = (eYear - sYear) * 12 + (eMonth - sMonth + 1); 
            num = sMonth;
 
            ArrayList<String> dmap = new ArrayList<String>();
            for (int k = 1; k <= diff; k++) {
                dmap.add(sYear + "_" + (int) Math.ceil(sMonth / 3.0)+ "Q");
 
                if (num == 12) {
                    sYear++;
                    num = 0;
                    sMonth = 1;
                } else {
                    sMonth++;
                }
 
                num++;
            }
 
            for (int i = 0; i < dmap.size(); i++) {
                if (!dates.contains(dmap.get(i))) {
                    dates.add(dmap.get(i));
                }
            }
            
        } else if (type.equals("YEAR")) {
            diff = (eYear - sYear) == 0 ? 1 : ((eYear - sYear) + 1);
 
            for (int k = 1; k <= diff; k++) {
                dates.add(String.valueOf(sYear));
                sYear++;
            }
        } else if (type.equals("WEEK")) {                
            diff = (eYear - sYear) * 52 + (eWeek - sWeek + 1); 
            num = sWeek;
 
            for (int k = 1; k <= diff; k++) {
                dates.add(sYear + "-" + sWeek);
 
                if (num == 52) {
                    sYear++;
                    num = 0;
                    sWeek = 1;
                } else {
                    sWeek++;
                }
                num++;
            }
        }
        
        
}
    
    
    return dates;
}
 
 
public int getWeekData(String date) {    
    Calendar calendar = Calendar.getInstance();   
    String[] dates = date.split("-");    
    int year = Integer.parseInt(dates[0]);    
    int month = Integer.parseInt(dates[1]);    
    int day = Integer.parseInt(dates[2]);    
    calendar.set(year, month - 1, day);    
    return calendar.get(Calendar.WEEK_OF_YEAR);
}
cs

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글