1.1 Calendar와 Date
Calendar는 추상클래스
// 추상클래스는 인스턴스를 생성할 수 없다.
Calendar cal = new Calendar();
// getInstance() 메서드는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환함.
Calendar cal = Calendar.getInstance();
⇒ 직접 객체 생성X , getInstance() 메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 함
메서드를 통해 인스턴스를 반환받게 하는 이유 ⇒ 최소한의 변경으로 프로그램이 동작할수 있도록 하기 위한것(다른 종류의 인스턴스를 필요로 하는 경우에 직접 클래스를 변경 하지 않아도됨)
Calendar를 상속받아 완전히 구현한 클래스 ⇒ GregorianCalendar , BuddhistCalendar
- getInstance()는 시스템의 국가와 지역설정을 확인 후 태국인 경우에는 BuddhistCalendar의 인스턴스를 반환, 그 외에는 GregorianCalendar의 인스턴스를 반환
- GregorianCalendar는 Calendar를 상속받아 전세계 공통으로 사용하고 있는 그레고리력에 맞게 구현한 것으로 태국을 제외한 나머지 국가에서는 GregorianCalendar를 사용하면됨
// 1.Calendar 를 Date로 변환
Calendar cal = Calendar.getInstance();
Date d = new Date(cal.getTimeInMillis()); // Date(long date)
// 2. Date를 Calendar로 변환
Date d = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(d);
주의사항
- get(Calendar.MONTH)로 얻어오는 값의 범위가 1~12 가 아닌 0~11 라는 것
- get(Calendar.MONTH)로 얻어오는 값이 0이면 1월 11이면 12월을 의미함.
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();
date1.set(2022, 9, 15); // 2022 - 10 - 15 //set()날짜와 시간을 원하는값으로 변경가능
long difference = ((date2.getTimeInMillis() - date1.getTimeInMillis())/(24*60*60*1000));
System.out.println(difference + "일");
↑ 두 날짜간의 차이를 구하는 예제
- getTimeInMillis()는 1/1000초 단위로 값을 반환 즉 초를 얻기위해선 1000으로 나눠야함
- 일단위로 얻기 위해서는 24(시간) * 60(분) * 60(초) * 1000 으로 나눠야함
두 개의 시간 데이터로부터 초 단위로 차이를 구한 다음, 시분초로 바꿔 출력하는 예제
- 차이의 초를 시간단위(3600초)로 나누고 나머지를 분단위(60초)로 나누면 그 나머지는 초 단위의 값이 된다.
add(int field, int amount)를 사용하면 지정한 필드의 값을 원하는 만큼 증가 또는 감소 시킬 수 있다. 즉 특정 날짜 또는 시간을 기점으로 해서 일정기간 전후의 날짜와 시간을 알아낼 수 있다.
💡 ex) calendar.add(Calendar.DATE, 1) ⇒ 1일 후 , calendar.add(Calendar.DATE, -6) ⇒ 6일전
{Calendar 개체}.before({비교대상}) ⇒ {비교대상} 보다 {Calendar 개체}가 이전인가? 라는의미와 같음. Calendar 개체.after()은 개체가 비교대상 이후인가? 라는 의미와 같음
💡 TIP : 다음달의 1일에서 하루를 빼면 이번달의 마지막 일을 알 수 있음!! ex) 2월의 마지막 날을 알고 싶을 땐 3월1일 에서 하루를 빼면 된다.
Calendar를 사용하지 않고 substring을 이용해 개월 차이를 구하는 예제
- 년* 12 = 개월수, 개월수 - 개월수 = 개월차이//를 구할수 있음.