250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 빅 오 표기법
- @RequiredArgsConstructor
- 연결 리스트
- 마크다운 테이블
- @NoArgsConstructor
- 스택 큐 차이
- CleanCode
- 리스트
- 배열
- 클린
- mysql
- 자료구조
- 선형 리스트
- query
- code
- 계산 검색 방식
- 쿠키
- JsonNode
- 내부 정렬
- 마크다운
- 클래스
- 클린코드
- java
- 트리
- 인터페이스
- WebClient
- 쿼리메소드
- 정렬
- @ComponentScan
- 코드
Archives
- Today
- Total
Developer Cafe
사례를 통해 JAVA코드로 달력 구현하기 본문
728x90
맨 아래에 쓰여진 매소드 정리해놨습니다.
2021/07/01 로 기본 세팅
int month = 7;
int year = 2021;
Calendar cal = Calendar.getInstance();
cal.set(year,month-1,1);
사례1. 연월일이 정확히 몇주차인지 알고싶다.
System.out.println(getCurrentWeekOfMonth(2021,6,20));
6월의 3주차라는 의미다.
사례2. 해당날짜의 마지막 날짜가 몇일인지 알고싶다.
System.out.println(cal.getActualMaximum(Calendar.DAY_OF_MONTH));
2021년 7월은 31일이 마지막 날짜다 라는 의미다.
사례3. 해당날짜의 마지막 주차가 몇주차인지 알고싶다.
System.out.println(getCurrentWeekOfMonth(year,month,cal.getActualMaximum(Calendar.DAY_OF_MONTH)));
7월은 5주차까지 있다라는 의미이다.
사례4-1. 각 주차별 첫째 날짜와 마지막 날짜를 알고싶다.
List<String> result = getWeekInMonths(year,month);
System.out.println(result);
사례4-2. 사례4-1에서 구한 결과값을 yyyy-MM-dd 형태로 변환하고 싶다.
List<String> result = getWeekInMonths(year,month); // 일단 1픽
System.out.println(result);
try {
SimpleDateFormat dtFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat newDtFormat = new SimpleDateFormat("yyyy-MM-dd");
for (int i = 0 ; i<result.size() ; i++) {
// String 타입을 Date 타입으로 변환
Date formatDate = dtFormat.parse(result.get(i));
// Date타입의 변수를 새롭게 지정한 포맷으로 변환
String strNewDtFormat = newDtFormat.format(formatDate);
System.out.println(strNewDtFormat);
}
}catch (ParseException e) {
e.printStackTrace();
}
여기서부터는 예제에 쓰인 매소드들 입니다.
getCurrentWeekOfMonth
public static String getCurrentWeekOfMonth(int year, int month, int day) {
int subtractFirstWeekNumber = subWeekNumberIsFirstDayAfterThursday(year, month, day);
int subtractLastWeekNumber = addMonthIsLastDayBeforeThursday(year, month, day);
// 마지막 주차에서 다음 달로 넘어갈 경우 다음달의 1일을 기준으로 정해준다.
// 추가로 다음 달 첫째주는 목요일부터 시작하는 과반수의 일자를 포함하기 때문에 한주를 빼지 않는다.
if (subtractLastWeekNumber > 0) {
day = 1;
subtractFirstWeekNumber = 0;
}
if (subtractFirstWeekNumber < 0) {
Calendar calendar = Calendar.getInstance(Locale.KOREA);
calendar.set(year, month - 1, day);
calendar.add(Calendar.DATE, -1);
return getCurrentWeekOfMonth(calendar.get(Calendar.YEAR), (calendar.get(Calendar.MONTH) + 1), calendar.get(Calendar.DATE));
}
Calendar calendar = Calendar.getInstance(Locale.KOREA);
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setMinimalDaysInFirstWeek(1);
calendar.set(year, month - (1 - subtractLastWeekNumber), day);
int dayOfWeekForFirstDayOfMonth = calendar.get(Calendar.WEEK_OF_MONTH) - subtractFirstWeekNumber;
// return (calendar.get(Calendar.MONTH) + 1) + "," + dayOfWeekForFirstDayOfMonth;
return (calendar.get(Calendar.MONTH) + 1) + "," + dayOfWeekForFirstDayOfMonth;
}
subWeekNumberIsFirstDayAfterThursday (getCurrentWeekOfMonth 가 호출함)
public static int subWeekNumberIsFirstDayAfterThursday(int year, int month, int day) {
Calendar calendar = Calendar.getInstance(Locale.KOREA);
calendar.set(year, month - 1, day);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.setFirstDayOfWeek(Calendar.MONDAY);
int weekOfDay = calendar.get(Calendar.DAY_OF_WEEK);
if ((weekOfDay >= Calendar.MONDAY) && (weekOfDay <= Calendar.THURSDAY)) {
return 0;
} else if (day == 1 && (weekOfDay < Calendar.MONDAY || weekOfDay > Calendar.TUESDAY)) {
return -1;
} else {
return 1;
}
}
addMonthIsLastDayBeforeThursday (getCurrentWeekOfMonth 가 호출함)
public static int addMonthIsLastDayBeforeThursday(int year, int month, int day) {
Calendar calendar = Calendar.getInstance(Locale.KOREA);
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.set(year, month - 1, day);
int currentWeekNumber = calendar.get(Calendar.WEEK_OF_MONTH);
int maximumWeekNumber = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
if (currentWeekNumber == maximumWeekNumber) {
calendar.set(year, month - 1, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
int maximumDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (maximumDayOfWeek < Calendar.THURSDAY && maximumDayOfWeek > Calendar.SUNDAY) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
}
getWeekInMonths
public static List<String> getWeekInMonths(int year, int month) {
List<String> result = new ArrayList<>();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month - 1);
for (int week = 1; week < cal.getMaximum(Calendar.WEEK_OF_MONTH); week++) {
cal.set(Calendar.WEEK_OF_MONTH, week);
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
int startDay = cal.get(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
int endDay = cal.get(Calendar.DAY_OF_MONTH);
if (week == 1 && startDay >= 7) {
startDay = 1;
}
if (week == cal.getMaximum(Calendar.WEEK_OF_MONTH) - 1 && endDay <= 7) {
cal.set(Calendar.MONTH, month - 1);
endDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
}
String monthR = Integer.toString(month);
String startDayR = Integer.toString(startDay);
String endDayR = Integer.toString(endDay);
if (month<10) monthR = "0"+monthR;
if (startDay<10) startDayR = "0"+startDayR;
if (endDay<10) endDayR = "0"+endDayR;
result.add(year+monthR+startDayR);
result.add(year+monthR+endDayR);
// System.out.println(week + "주 : " + startDay + " ~ " + endDay);
}
return result;
}
getWeekOfYear
private static int getWeekOfYear(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_MONTH);
}
728x90
'JAVA' 카테고리의 다른 글
Json value 값에서 특정데이터 입력시 요구데이터 값들 가져오기 (0) | 2021.08.05 |
---|---|
PHP Json형태를 JAVA Json형태로 변경하기 (1) | 2021.08.05 |
Optional (0) | 2021.05.21 |
DTO 설계하기 (0) | 2021.05.11 |
JIT 컴파일러 (Just-In-Time 컴파일러) (0) | 2021.03.06 |
Comments