Java Date와 Calendar

유방현·2024년 10월 23일

1. java.util.Date 클래스

1.1 개요

  • 특정 시점의 날짜와 시간을 표현하는 클래스
  • 1970년 1월 1일 00:00:00 GMT (에포크 타임)부터의 밀리초를 기준으로 함
  • 대부분의 메서드가 deprecated 되었으며, Calendar나 LocalDateTime 사용 권장

1.2 주요 생성자

// 현재 날짜와 시간으로 생성
Date date1 = new Date();

// 밀리초로 생성
Date date2 = new Date(1234567890000L);

1.3 주요 메서드

Date date = new Date();

// 현재 시간을 밀리초로 반환
long time = date.getTime();

// 밀리초 설정
date.setTime(1234567890000L);

// 날짜 비교
Date date1 = new Date();
Date date2 = new Date();
boolean isAfter = date1.after(date2);
boolean isBefore = date1.before(date2);
int compareResult = date1.compareTo(date2);

// 문자열로 변환
String dateString = date.toString();

2. java.util.Calendar 클래스

2.1 개요

  • Date 클래스의 한계를 보완하기 위해 도입
  • 추상 클래스이며, getInstance()로 구현체 얻음
  • 시간대(TimeZone) 지원
  • 날짜와 시간 필드 개별 조작 가능

2.2 Calendar 생성

// 기본 시간대의 Calendar 얻기
Calendar cal = Calendar.getInstance();

// 특정 시간대의 Calendar 얻기
Calendar calNY = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));

// 특정 시점으로 설정
Calendar cal2 = Calendar.getInstance();
cal2.set(2024, Calendar.OCTOBER, 23);  // 2024년 10월 23일

2.3 날짜/시간 필드 다루기

Calendar cal = Calendar.getInstance();

// 개별 필드 얻기
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;  // 0-based month
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
int millisecond = cal.get(Calendar.MILLISECOND);

// 개별 필드 설정
cal.set(Calendar.YEAR, 2024);
cal.set(Calendar.MONTH, Calendar.OCTOBER);
cal.set(Calendar.DAY_OF_MONTH, 23);

// 여러 필드 한번에 설정
cal.set(2024, Calendar.OCTOBER, 23, 14, 30, 0);

// 필드 연산
cal.add(Calendar.DAY_OF_MONTH, 5);      // 5일 후
cal.add(Calendar.MONTH, -2);            // 2달 전
cal.roll(Calendar.DAY_OF_MONTH, 10);    // 일자만 변경 (월은 변경 안됨)

2.4 Date와 Calendar 변환

// Calendar → Date
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();

// Date → Calendar
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);

2.5 날짜 비교

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal2.add(Calendar.DAY_OF_MONTH, 1);

// 비교
boolean isAfter = cal1.after(cal2);
boolean isBefore = cal1.before(cal2);
int compareResult = cal1.compareTo(cal2);

// 차이 계산
long diffMillis = cal2.getTimeInMillis() - cal1.getTimeInMillis();
long diffDays = diffMillis / (24 * 60 * 60 * 1000);

3. 날짜/시간 포맷팅

3.1 SimpleDateFormat 사용

Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Date를 문자열로
String formatDate = sdf.format(date);

// 문자열을 Date로
try {
    Date parsedDate = sdf.parse("2024-10-23 14:30:00");
} catch (ParseException e) {
    e.printStackTrace();
}

3.2 주요 포맷 패턴

// 다양한 포맷 패턴 예시
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");          // 2024/10/23
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy년 MM월 dd일");    // 2024년 10월 23일
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 2024-10-23 14:30:00
SimpleDateFormat sdf4 = new SimpleDateFormat("E요일");               // 수요일
SimpleDateFormat sdf5 = new SimpleDateFormat("yyyy.MM.dd a hh:mm");  // 2024.10.23 오후 02:30

4. 실용적인 사용 예제

4.1 특정 기간 날짜 리스트 생성

public static List<Date> getDatesBetween(Date startDate, Date endDate) {
    List<Date> dates = new ArrayList<>();
    Calendar cal = Calendar.getInstance();
    cal.setTime(startDate);

    while (!cal.getTime().after(endDate)) {
        dates.add(cal.getTime());
        cal.add(Calendar.DATE, 1);
    }
    return dates;
}

4.2 나이 계산

public static int calculateAge(Date birthDate) {
    Calendar birth = Calendar.getInstance();
    birth.setTime(birthDate);
    Calendar today = Calendar.getInstance();

    int age = today.get(Calendar.YEAR) - birth.get(Calendar.YEAR);

    if (today.get(Calendar.DAY_OF_YEAR) < birth.get(Calendar.DAY_OF_YEAR)) {
        age--;
    }
    return age;
}

4.3 날짜 차이 계산

public static long getDaysBetween(Date start, Date end) {
    Calendar cal1 = Calendar.getInstance();
    Calendar cal2 = Calendar.getInstance();
    cal1.setTime(start);
    cal2.setTime(end);

    // 시분초 초기화
    cal1.set(Calendar.HOUR_OF_DAY, 0);
    cal1.set(Calendar.MINUTE, 0);
    cal1.set(Calendar.SECOND, 0);
    cal2.set(Calendar.HOUR_OF_DAY, 0);
    cal2.set(Calendar.MINUTE, 0);
    cal2.set(Calendar.SECOND, 0);

    return (cal2.getTimeInMillis() - cal1.getTimeInMillis()) / (1000 * 60 * 60 * 24);
}

5. 주의사항

  1. Date 클래스의 대부분 메서드는 deprecated
  2. Calendar의 월(Month)은 0부터 시작 (0: 1월, 11: 12월)
  3. SimpleDateFormat은 스레드 안전하지 않음
  4. 최신 Java에서는 java.time 패키지 사용 권장
  5. 시간대 처리 시 주의 필요

6. 권장사항

  1. 가능하면 java.time 패키지 사용 (Java 8 이상)
  2. SimpleDateFormat 인스턴스는 재사용하지 말 것
  3. 날짜 연산 시 Calendar 클래스 활용
  4. 시간대 관련 처리 시 항상 TimeZone 고려

0개의 댓글