본문 바로가기
DEV/Java

[자바] Calendar

by 어쩌다개발 2023. 2. 2.
반응형

Calendar 

Calendar는 추상 클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해서 완전히 구현된 클래스의 인스터스를 얻어야 한다.
getInstance()는 시스템의 국가와 지역 설정을 확인해서 태국을 제외하고는 GregorianCalendar의 인스턴스를 반환한다.
(태국의 경우 BuddhistCalendar 인스턴스 반환)
GregorianCalendar는 Calendar를 상속받아 오늘날 전섹 공통으로 사용하고 있는 그레고리력에 맞게 구현한 것이다.
인스턴스를 직접 생성해서 사용하지 않고 메서드를 통해서 인스턴스를 반환받게 하는 이유는 최소한의 변경으로 프로그램이 동작할 수 있도록 하기 위해서이다.

public class CalendarEx1 {
    public static void main(String[] args) {
    
        Calendar today = Calendar.getInstance();
    
    	System.out.println(today.get(Calendar.YEAR)); //이 해의 년도
        System.out.println(today.get(Calendar.MONTH)); //월(0 ~ 11), 1월은 0부터 시작
        System.out.println(today.get(Calendar.WEEK_OF_YEAR)); //이 해의 몇 째주
        System.out.println(today.get(Calendar.WEEK_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(today.get(Calendar.DAY_OF_WEEK)); //요일(1~ 7), 일요일부터 시작(1부터)
        System.out.println(today.get(Calendar.DAY_OF_WEEK_IN_MONTH)); //이 달의 몇 째 요일
        System.out.println(today.get(Calendar.AM_PM)); //오전(0), 오후(1)
        System.out.println(today.get(Calendar.HOUR)); //시간(0~11)
        System.out.println(today.get(Calendar.HOUR_OF_DAY)); //시간(0~23)
        System.out.println(today.get(Calendar.MINUTE)); //분(0~59)
        System.out.println(today.get(Calendar.SECOND)); //초(0~59)
        System.out.println(today.get(Calendar.MILLISECOND)); //1000분의 1초
        System.out.println(today.get(Calendar.ZONE_OFFSET)/(60*60*1000)); //TimeZone(-12~+12) - 1시간: 60*60초
        System.out.println(today.getActualMaximum(Calendar.DATE)); //이 달의 마지막 날
    }
}

결과

2023
1
5
1
2
2
33
5
1
1
7
19
22
7
532
9
28

어제 기준으로 오늘까지 지난 시간, 분, 초 구하기

public class CalendarEx2 {

    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.set(2023, 1, 1, 24, 00, 00); //2023.02.01.24:00:00 기준

        long diff = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;

        String tmp = "";
        for(int i = 0; i < TIME_UNIT.length; i++) {
            tmp += diff / TIME_UNIT[i] + TIME_UNIT_NAME[i];
            diff %= TIME_UNIT[i];
        }

        System.out.println(tmp);
    }
}

결과

20시간43분56초

String으로 년,월이 제공될 때 개월 수 차이 구하기

public class CalendarEx5 {
    public static void main(String[] args) {
        String str_date = "202302";
        String end_date = "202303";

        int srt_month = Integer.parseInt(str_date.substring(0, 4)) * 12 + Integer.parseInt(str_date.substring(4));
        int end_month = Integer.parseInt(end_date.substring(0, 4)) * 12 + Integer.parseInt(end_date.substring(4));

        System.out.println("srt_date와 end_date 차이 " + Math.abs(srt_month - end_month) + "개월");
    }
}

결과

srt_date와 end_date 차이 1개월

Date 와 Calendar간의 변환

Calendar 가 새로 추가되면서 Date의 대부분 메서드가 deprecated 되어서 잘 사용하지 않지만, 혹시나 사용하는 프로젝트가 있다면 아래와 같이 사용하면 된다.

//Calendar를 Date로 변환
Calenar cal = Calendar.getInstence();
Date d = new Date(cal.getTimeInMillis());

//Date를 Calendar로 변환
Date d = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(d);

SimpleDateFormat 참고 : https://devmango.tistory.com/147

반응형

'DEV > Java' 카테고리의 다른 글

[자바] SimpleDateFormat  (2) 2023.02.02
[자바] 형식화 클래스  (1) 2023.02.02
[자바] 사용자 정의 예외 만들기  (2) 2023.02.01
[자바] default method 와 static method  (2) 2023.02.01
[자바] 4. 배열 리스트  (0) 2022.01.15

댓글