[p.383] Calendar클래스와 SimpleDataFormat 클래스를 이용해서 2020년의 매월 두 번째 일요일 날짜를 출력
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
class Exercise1 {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일입니다.");
for (int i=0; i < 12 ; i++) {
cal.set(Calendar.YEAR, 2020); //고정값
cal.set(Calendar.DAY_OF_WEEK, 1); //고정값
cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2); //변동값
cal.set(Calendar.MONTH, i); //변동값
Date date = new Date(cal.getTimeInMillis());
System.out.println(df.format(date));
}
}
}
<풀이 과정>
1) 2020년의 2번째 일요일이 키포인트라고 판단
2) 1월부터 12월 사이의 값 추출 ⇒ 즉 월은 바뀌되, 년/요일/n번째는 고정
3) Calendar 함수 설정
4) SimpleDataFormat으로 형식화 설정
5) Month 반복문 설정_for문
6) Calendar 객체를 Date로 변경
7) 만들어진 형식화로 출력
<시행 착오>
1) 사고
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
class Exercise1_2 {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
//dateformat 사용을 위해서 cal -> date화 해야함
Date date = new Date(cal.getTimeInMillis());
DateFormat df = new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일입니다.");
for (int i = 0; i < 12 ; i++) {
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2);
cal.set(Calendar.DAY_OF_WEEK, 1);
cal.set(Calendar.MONTH, i);
}
System.out.println(df.format(date));
//아무것도 없거든 그래서 세팅값을 일단 2020년으로 맞추자
//2) 2번쨰 일요일을 2020년도에서 찾아야할 것 같음 -> 일단 이게 문젠데 어떻게 찾냐
//Calendear.year = 2020년 설정하고, while 문에서 get하는 거야 F번째 E요일을 yy-MM-dd를
}
}
2) 코드 수정
import java.util.Calendar;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class Exercise1 {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020); // 고정값
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); // 일요일로 고정
cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2); // 2번째로 고정
DateFormat df = new SimpleDateFormat("yyyy-MM-dd은 F번째 E요일입니다.");
for (int i = 0; i < 12; i++) {
cal.set(Calendar.MONTH, i); // 월을 변경하여 2번째 일요일을 찾음
Date date = new Date(cal.getTimeInMillis());
System.out.println(df.format(date));
}
}
}
* 요일이 변경되는 문제가 발생 (일 -> 월 -> 화.. +++)
3) 최종 수정
: `Calendar` 객체의 상태가 반복문 안에서 변경되고 있기 때문에 문제가 발생했다.
`Calendar` 객체는 참조 타입이기 때문에 `cal` 변수가 변경되면 이전에 생성된 `Date` 객체가 영향을 받는다.
이를 해결하기 위해서는 매번 새로운 `Calendar` 객체를 생성하여 사용해야 한다.
>> 따라서 각각의 반복에서 독립적인 `Calendar` 객체를 사용하므로 원하는 결과를 얻었다.
[남궁성 선생님 풀이_원본]
1) 주석 / 코드
import java.util.*;
import java.text.*;
class Exercise10_1
{
public static void main(String[] args)
{
Calendar cal = Calendar.getInstance();
cal.set(2020, 0, 1); // cal 2020 1 1 의 날 를 년 월 일로 설정
for(int i=0; i < 12;i++) {
int weekday = cal.get(Calendar.DAY_OF_WEEK); // 1 . 일의 요일을 구한다
// 1 . 두 번째 일요일은 일의 요일에 따라 달라진다
// 1 8 , 일이 일요일인 경우에는 두번째 일요일은 일이고
// 1 16 1 (weekday) . 일이 다른 요일일 때는 에서 일의 요일 을 빼면 알 수 있다
int secondSunday = (weekday==1) ? 8 : 16 - weekday;
// (secondSunday) cal (DAY_OF_MONTH) . 두 번째 일요일 로 의 날짜 를 바꾼다
cal.set(Calendar.DAY_OF_MONTH, secondSunday);
Date d = cal.getTime(); // Calendar Date . 를 로 변환한다
System.out.println(new SimpleDateFormat("yyyy-MM-dd F E 은 번째 요일입니
다.").format(d));
// 1 . 날짜를 다음달 일로 변경한다
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH,1);
}
}
}
2) 코드만
import java.util.*;
import java.text.*;
class Exercise10_1
{
public static void main(String[] args)
{
Calendar cal = Calendar.getInstance();
cal.set(2020, 0, 1);
for(int i=0; i < 12;i++) {
int weekday = cal.get(Calendar.DAY_OF_WEEK);
int secondSunday = (weekday==1) ? 8 : 16 - weekday;
cal.set(Calendar.DAY_OF_MONTH, secondSunday);
Date d = cal.getTime();
System.out.println(new SimpleDateFormat("yyyy-MM-dd F E 은 번째 요일입니
다.").format(d));
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH,1);
}
}
}
728x90
'Java > [문제해결]' 카테고리의 다른 글
[김영한의 실전 자바_중급1] 열거형(ENUM)_중복제거 (p.25) (0) | 2024.04.25 |
---|---|
[김영한의 실전 자바_중급1] 열거형(ENUM)_연습문제 3(p.29) (0) | 2024.04.17 |