자바의 정석 - 날짜와시간, Calendar클래스

Yohan·2024년 2월 7일
0

날짜와 시간

  • java.util.Date
    • 날짜와 시간을 다룰 목적으로 만들어진 클래스
    • Date의 메서드는 거의 deprecated되었지만 여전히 쓰이고 있다.
  • java.util.Calendar
    • Date클래스를 개선한 새로운 클래스(JDK1.1), 여전히 단점 존재
  • java.time 패키지
    • Date, Calendar의 단점을 개선한 새로운 클래스들을 제공

Calendar클래스

  • 추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야한다.
Calendar cal = new Calendar(); // 에러!! 추상클래스는 인스턴스 생성 X

// ok, getInstance()메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환
Calendar cal = Calendar.getInstance();

Calendar클래스 예제1

  • get()으로 날짜와 시간 필드 가져오기 - int get(int field)
public class Ex1 {
	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간으로 셋팅
		int thisYear = cal.get(Calendar.YEAR); // 올해가 몇년인지
        									   // YEAR자리에 다양한 필드가 들어갈 수 있음!
		int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); // 이 달의 마지막날
	}
}
  • Calendar에 정의된 필드
    • YEAR, 년
    • MONTH, 월 (0부터 시작)
    • WEEK_OF_YEAR, 그 해의 몇 번째 주
    • WEEK_OF_MONTH, 그 달의 몇 번째 주
    • DATE, 일
    • DAY_OF_MONTH, 그 달의 몇 번째 일
    • DAY_OF_YEAR, 그 해의 몇 번째 일
    • DAY_OF_WEEK, 요일
    • DAY_OF_WEEK_IN_MONTH, 그 달의 몇 번째 요일
    • HOUR, 시간 (0~11)
    • HOUR_OF_DAY, 시간 (0~23)
    • MINUTE, 분
    • SECOND, 초
    • MILLISECOND, 천분의 일초
    • ZONE_OFFSET, GMT기준 시차
    • AM_PM, 오전/오후

Calendar클래스 예제2

  • set()으로 날짜와 시간 지정하기
void set(int year, int month, int date, int hourOfDay, int minute, int second)
  • 날짜 지정하는 방법, 월(MONTH)이 0부터 시작한다는 점에 주의
Calendar date1 = Calendar.getInstance();
date1.set(2017, 7, 15); // 2017년 8월 15일 (7월 x)
// date1.set(Calendar.YEAR, 2017);
// date1.set(Calendar.MONTH, 7);
// date1.set(Calendar.DATE, 15);
  • 시간 지정하는 방법
Calendar time1 = Calendar.getInstance();
time1.set(Calendar.HOUR_OF_DAY, 10); // time1을 10시 20분 30초로 설정
time1.set(Calendar.MINUTE, 20);
time1.set(Calendar.SECOND, 30);
  • 실습
public class Ex1 {
	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();
		
		// 시간 설정 생략
		
		// 시간의 차이 (초로 통일시켜서 계산)
		long difference =
				Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis())/1000; // getTimeInMillis() : 시분초 -> 초로
				System.out.println("tim1과 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 + "입니다.");
	}
}

Calendar클래스 예제3

  • clear()는 Calendar객체의 모든 필드를 초기화
    • 1970년 1월 1일 00:00:00으로 설정됨 (컴퓨터가 시작된 이후)
  • claer(int field)는 Calendar객체의 특정 필드를 초기화
dt.clear(Calendar.SECOND); // 초를 초기화
dt.clear(Calendar.MINUTE); // 분을 초기화

Calendar클래스 예제4

  • get() : 필드 읽기, set() : 필드 변경, clear() : 필드 초기화
  • add()는 특정 필드의 값을 증가 또는 감소 (다른 필드에 영향 O)
Calendar date = Calendar.getInstance();
date.clear(); // 모든 필드 초기화
date.set(2020, 7, 31); // 2020년 8월 31일로 설정

date.add(Calendar.DATE, 1); // 날짜(DATE)에 1을 더한다. -> 9월 1일(다른 필드에 영향이 가므로 월도 바뀜)
date.add(Calendar.MONTH, -8); // 월(MONTH)에 8을 뺀다.
  • roll()은 특정 필드의 값을 증가 또는 감소 (다른 필드에 영향 X)
date.set(2020, 7, 31); // 2020년 8월 31일로 설정

// add()와 달리 roll()은 다른 필드에 영향을 미치지 않는다.
date.roll(Calendar.DATE, 1); // 9월 1일 x
date.roll(Calendar.MONTH, -8);
profile
백엔드 개발자

0개의 댓글