JAVA

[Java] Calendar Exercise (예제)

SangRok Jung 2022. 7. 19. 22:44
반응형

2020년의 매월 두번째 일요일의 날짜를 출력하시오.


▶ 해법

 

  1. Calendar를 2020년 1월 1일로 설정한다.
  2.  반복문으로 1월~12월 두번째 일요일의 출력한다.
    1. 1일이 일요일이 아닌경우 16에서 1일의 날짜를 빼면 두번째 일요일의 날짜를 구할 수 있다.
  3. SimpleDateFormat으로 출력한다.

 

    public static void main(String[] args) {

        Calendar time = Calendar.getInstance();
        time.set(2020, 0, 01);

        for(int i = 0; i < 12; i++) {
            // 1일의 요일을 구한다.
            // EX) 7 = 토요일, 1 = 일요일
            int weekDay = time.get(Calendar.DAY_OF_WEEK);
            
            // 둘째주 일요을 찾는다.
            if(weekDay == 1){
                time.set(Calendar.DAY_OF_MONTH, 8);
            }
            else{
                time.set(Calendar.DAY_OF_MONTH, 16 - weekDay);
            }

            // Data로 형식을 바꿔준다.
            Date date = time.getTime();


            // 출력
            System.out.println(new SimpleDateFormat("yyyy-MM-dd는 F번째 E요일 입니다.").format(date));

            // 월을 더해주고, 일을 1일로 초기화 한다.
            time.add(Calendar.MONTH, 1);
            time.set(Calendar.DAY_OF_MONTH, 1);
        }
    }

 

 

 

 

 

 

 

 

화면으로부터 날짜를 "yyyy/MM/dd" 형태로 출력받아서 무슨 요일인지 출력하는 프로그렘을 작성하시오. 단 입력된 날짜의 형식이 잘못된 경우 메세지를 보여주고 다시 입력받아야 한다.


▶ 해법

 

  1. 입력받을 pattern과 출력할 pattern을 설정한다.
  2. SimpleDateFormat에 각각의 pattern을 설정한다.
  3. Scanner를 설정한다.
  4. 출력할 Date를 설정한다.
  5. do while문으로 정상적인 입력을 받을 때 까지 입력을 받는다.
  6. 출력한다.

 

package hello0719;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Exercise10_2 {
    public static void main(String[] args) {
        // pattern set
        String pattern1 = "yyyy/MM/dd";
        String pattern2 = "입력하신 날짜는 E요일 입니다.";

        // SDF set
        DateFormat sdf  = new SimpleDateFormat(pattern1);
        DateFormat sdf2 = new SimpleDateFormat(pattern2);

        // Scanner set
        Scanner s = new Scanner(System.in);

        // Date 설정
        Date inDate = null;
        
        // 화면으로 부터 날짜를 입력 받는다.
        do{
            System.out.println("날짜를" + pattern1 + "의 형태로 입력해주세요. (입력예 : 2017/05/11)");
            try {
                System.out.print(">>>");
                inDate = sdf.parse(s.nextLine());
                break;

            }
            catch(Exception e){
                System.out.println("다시 입력하세요.");
            }
        }
        while(true);

        // 출력
        System.out.println(sdf2.format(inDate));

    }
}

 

 

 

 

 

 

 

 

 

어떤 회사의 월급날이 매월 21일이다. 두 날짜 사이에 월급날이 몇번있는지 계산해서 반환하는 메서드를 작성하시오.


▷ 존재하는 Code

 

    static void printResult(Calendar from, Calendar to) { 
        Date fromDate   = from.getTime();
        Date toDate     = to.getTime();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        System.out.print(sdf.format(fromDate) + " ~ " + sdf.format(toDate) + " : ");
        System.out.println(paycheckCount(from, to)); 
    }

    public static void main(String[] args) { 
        Calendar fromCal = Calendar.getInstance();
        Calendar toCal = Calendar.getInstance();

        fromCal.set(2020,0,1); 
        toCal.set(2020,0,1);
        printResult(fromCal, toCal);

        fromCal.set(2020,0,21); 
        toCal.set(2020,0,21); 
        printResult(fromCal, toCal);

        fromCal.set(2020,0,1); 
        toCal.set(2020,2,1); 
        printResult(fromCal, toCal);

        fromCal.set(2020,0,1); 
        toCal.set(2020,2,23); 
        printResult(fromCal, toCal);

        fromCal.set(2020,0,23); 
        toCal.set(2020,2,21); 
        printResult(fromCal, toCal);

        fromCal.set(2021,0,22); 
        toCal.set(2020,2,21); 
        printResult(fromCal, toCal);
    }

 

 

 

▷ 추가 해야하는 method

    static int paycheckCount(Calendar from, Calendar to) {
        int monDiff;

		// 0. from의 년도가 to보다 많을 경우 0을 반환한다.
        if(from.get(Calendar.YEAR) > to.get(Calendar.YEAR)){
            return 0;
        }

        // 1. from 또는 to가 null이면 0을 반환한다.
        if(from == null || to == null){
            return 0;
        }

        // 2. from과 to가 같고 날짜가 21일이면 1을 반환한다.
        if(from.equals(to) && from.get(Calendar.DAY_OF_MONTH) == 21){
            return 1;
        }
     
        // 3. to와 from이 몇개월 차이인지 계산해서 변수 monDiff에 담는다.
        monDiff = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);

        // 4. monDiff가 음수라면 0을 반환한다.
        if(monDiff < 0){
            return 0;
        }

        // 5. 만일 from의 일(DAY_OF_MONTH)가 21일이거나 이전이고 
        //    to의 일(DAY_OF_MONTH)이 21일 이거나 이후이면 monDiff의 값을 1 증가시킨다.
        if(from.get(Calendar.DAY_OF_MONTH) <= 21 && to.get(Calendar.DAY_OF_MONTH) >= 21){
            monDiff++;
        }

        // 6. 만일 from의 일(DAY_OF_MONTH)dl 21일 이후고
        //    to의일(DAY_OF_MONTH)이 21일 이전이면 monDiff의 값을 1감소 시킨다.
        if(from.get(Calendar.DAY_OF_MONTH) > 21 && to.get(Calendar.DAY_OF_MONTH) < 21){
            monDiff--;
        }

        return monDiff;
    }

 

 

 

 

 

 

 

 

 

 

 

자신이 태어난 날 부터 지금 까지 며칠이 지났는지 계산해서 출력하시오.


public static void main(String[] args) {
        //자신이 태어난 날터 현재까지 몇일이 지났는지 계산하여 출력하시오.

        // 태어난날, 현재 Calender 생성
        Calendar date1 = Calendar.getInstance(); 
        Calendar date2 = Calendar.getInstance();

        // 태어난날, 현재 Calender 시간 설정 
        date1.set(2000, 0, 1); // 2000년 1월 1일로 날짜를 설정한다. 
        date2.set(2016, 0, 29); // 2016년 1월 29일로 날짜를 설정한다.

        // SDF의 pattern 설정
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        // 태어난날, 현재 시간 출력
        System.out.println("birth day=" + df.format(new Date(date1.getTimeInMillis())));
        System.out.println("today =" + df.format(new Date(date2.getTimeInMillis())));

        // 몇일이 지났는지 계산
        long difference = (date2.getTimeInMillis() - date1.getTimeInMillis())/1000;
        System.out.println("difference = " + difference);

        System.out.println(difference/(24*60*60) +"days"); //1일 =24*60*60
}

 

 

반응형

'JAVA' 카테고리의 다른 글

[Java] Collections Framework - List Interface  (0) 2022.07.21
[Java] Collections Framework  (0) 2022.07.21
[Java] Format Class(형식화 클래스)  (0) 2022.07.15
[Java] Calendar Class  (0) 2022.07.14
[Java] Collections Framework (총정리)  (0) 2022.07.05