JAVA

[Java] Calendar Class

SangRok Jung 2022. 7. 14. 15:11
반응형

Calendar Class


  • Calendar는 추상 클래스이기 때문에 직접 개체를 생성할 수 없으며 method를 통해서 완전히 구현된 class의 instance를 얻어야 한다.

 

    public static void main(String[] args) {
        
        Calendar today = Calendar.getInstance();
        System.out.println("이 해의 년도 : " + today.get(Calendar.YEAR));
        System.out.println("월(0~11, 0:1월) : " + today.get(Calendar.MONTH));
        System.out.println("이 해의 몇 째주 : " + today.get(Calendar.WEEK_OF_YEAR));
        System.out.println("이 달의 몇 째주 : " + today.get(Calendar.WEEK_OF_MONTH));

        // DATE와 DAY_OF_MONTH 는 같다.
        System.out.println("이 달의 몇일 : " + today.get(Calendar.DATE));
        System.out.println("이 달의 몇일 : " + today.get(Calendar.DAY_OF_MONTH));

        System.out.println("이 해의 몇일 : " + today.get(Calendar.DAY_OF_YEAR));
        System.out.println("요일(1~7 1:일요일) : " + today.get(Calendar.DAY_OF_WEEK));
        System.out.println("이 달의 몇 째 요일 : " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println("오전_오후(0:오전, 1:오후" + today.get(Calendar.AM_PM));

        System.out.println("시간(0~11) : " + today.get(Calendar.HOUR));
        System.out.println("시간(0~23) : " + today.get(Calendar.HOUR_OF_DAY));
        
        System.out.println("분(0~59) : " + today.get(Calendar.MINUTE));
        System.out.println("초(0~59) : " + today.get(Calendar.SECOND));

        System.out.println("1000분의 1초(0~999) : " + today.get(Calendar.MILLISECOND));
        System.out.println("TimeZone(-12 ~ +12 : " + (today.get(Calendar.ZONE_OFFSET)/(60 * 60 * 1000)));
        System.out.println("이 달의 마지막 날 : " + today.getActualMaximum(Calendar.DATE));
        
    }

 

 

 

 

 

 

 

▶ 날짜와 시간을 원하는 값으로 변경하려면 set Method를 사용하면 된다.

void set(int field, int value)
void set(int year, int month, int date)
void set(int year, int month, int daet, int hourOfDay, int minute)
void set(int year, int month, int daet, int hourOfDay, int minute, int second)

 

 

 

 

 

 

 

▶ 두 날짜간의 차이를 구하기 위해서는 두 날짜를 최소단위인 초 단위로 변경한 다음 그 차이를 구하면된다.

 

getTimeMills()는 1/1000초 단위로 값을 반환하기 때문에 초단위로 얻기 위해서는 1000으로 나눠 주어야 하고, 일단위로 얻기 위해서는 "24(시간) * 60(분) * 60(초) * 1000으로 나누어야 한다.

    public static void main(String[] args) {
        // 요일은 1부터 시작하기 때문에, DAY_OF_WEEK[0]은 비워두웠다.
        final String[] DAY_OF_WEEK = {"", "일", "월", "화", "수", "목", "금", "토"};

        Calendar date1 = Calendar.getInstance();
        Calendar date2 = Calendar.getInstance();

        // month의 경우 0부터 시작하기 때문에 4월인 경우, 3으로 지정해야한다.
        // date1.set(2019, Calendar.APRIL, 29); 와 같이 할 수도 있다.

        //2019년 3월 29일로 날짜를 변경한다.
        date1.set(2019, 3, 29);

        System.out.println("date1은" + toString(date1) + DAY_OF_WEEK[date1.get(Calendar.DAY_OF_WEEK)] + "요일이고,");
        System.out.println("오늘(date2)은" + toString(date2) + DAY_OF_WEEK[date2.get(Calendar.DAY_OF_WEEK)] + "요일입니다.");

        // 두 날짜간의 차이를 얻으려면 getTimeInMillis() 천분의 일초 단위로 변환해야한다.
        long difference = (date2.getTimeInMillis() - date1.getTimeInMillis()) / 1000;

        System.out.println("date1부터 date2까지" + difference + "가 지났습니다.");
        System.out.println("일로 계산하면" + difference / (24 * 60 * 60) + "일입니다.");
    }

 

 

 

 

 

 

▶ 두개의 시간 데이터로부터 시간차를 시분초로 바꾸어 출력하기 위해서는 가장 큰 단위인 시간 단위 3600(초)로 나누고 나머지를 다시 분단위 60(초)로 나누면 그 나머지는 초 단위의 값이 된다.

    public static void main(String[] args) {
        final int[] TIME_UNIT = {3600, 60, 1};  //큰 단위를 앞에 놓는다.
        final String[] TIME_UNIT_NAME = {"시간", "분", "초"};

        Calendar time1 = Calendar.getInstance();
        Calendar time2 = Calendar.getInstance();

        // time1을 10시 20분 30초로 설정
        time1.set(Calendar.HOUR_OF_DAY, 10);    
        time1.set(Calendar.MINUTE, 30);
        time1.set(Calendar.SECOND, 30);

        // time2를 20시 30분 10초로 설정
        time2.set(Calendar.HOUR_OF_DAY, 20);
        time2.set(Calendar.MINUTE, 30);
        time2.set(Calendar.SECOND, 10);


        System.out.println("time1 : " + time1.get(Calendar.HOUR_OF_DAY) + "시 " + time1.get(Calendar.MINUTE) + "분 " + time1.get(Calendar.SECOND) + "초");
        System.out.println("time2 : " + time2.get(Calendar.HOUR_OF_DAY) + "시 " + time2.get(Calendar.MINUTE) + "분 " + time2.get(Calendar.SECOND) + "초");


        long difference = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
        System.out.println("time1과 time2의 차이는 " + difference + "초 입니다.");


        String tmp = "";
        for(int i = 0; i < TIME_UNIT.length; i++){
            tmp += difference / TIME_UNIT[i] + TIME_UNIT_NAME[i];
            difference %= TIME_UNIT[i];
        }
        System.out.println("시분초로 변환하면 " + tmp + "입니다.");
    }

 

 

 

 

 

 

 

 

▶ 다음달의 1일에서 하루를 빼면 이번달의 마지막 날을 알 수 있다. 예를 들면 2월 마지막 날을 알고 싶을 때 3월 1일에서 하루를 빼면 된다.

 

    public static void main(String[] args) {

        if(args.length != 2){
            System.out.println("Usage : java Ex10_5 2019 9");
        }

        int year = Integer.parseInt(args[0]);
        int month = Integer.parseInt(args[1]);
        int START_DAY_OF_WEEK = 0;
        int END_DAY = 0;

        Calendar sDay = Calendar.getInstance(); // 시작일
        Calendar eDay = Calendar.getInstance(); // 끝일

        // 월의 경우 0부터 11의까지의 값을 가지므로 1을 빼주어야 한다.
        // 예를 들어, 2019년 11월 1일은 sDay.set(2019, 10, 1); 과 같이 해줘야 한다.
        sDay.set(year, month-1, 1);
        eDay.set(year, month, 1);

        // 다음날의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막 날 (11월 30일)이 된다.
        eDay.add(Calendar.DATE, -1);

        // 첫 번째 요일이 무슨 요일인지 알아낸다.
        START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);

        // eDay에 지정된 날짜를 얻어온다.
        END_DAY = eDay.get(Calendar.DATE);

        System.out.println("    " + args[0] + "년 " + args[1] + "월");
        //................................................................

        // 월 말일을 알 수 있다. 
        getActualMaximum(Calendar.DATE);
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

▶ Date와 Calendar간의 변환

 

Calendar가 새로 추가되면서 Date는 대부분의 method가 deprecated되었으므로 잘 사용되지 않는다.

그럼에도 불구하고 여전이 Date를 필요로 하는 method들이 있기 때문에 변환할 일이 생긴다.

 

    // Calendar를 date로 변환
    Calendar cal1 = Calendar.getInstance();
    ...
    Date d1 = new Date(cal1.getTimeInMillis()); //Date(long date)


    // Date를 Calendar로 변환
    Date d2 = new Date();
    Calendar cal2 = Calendar.getInstance();
    ...
    cal2.setTime(d2);

 

 

 

반응형

'JAVA' 카테고리의 다른 글

[Java] Calendar Exercise (예제)  (0) 2022.07.19
[Java] Format Class(형식화 클래스)  (0) 2022.07.15
[Java] Collections Framework (총정리)  (0) 2022.07.05
[Java] Method of Math  (0) 2022.06.29
[Java] String Class의 Constructor & Method  (0) 2022.06.22