Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 날짜를 비교하는 3가지 방법 (LocalDate, Date, Calendar)

Java에서 두 날짜를 비교하는 작업은 매우 자주 사용되지만, 어떤 클래스를 사용하느냐에 따라 비교 방법이 달라집니다. 이 글에서는 LocalDate, Date, Calendar 세 가지 클래스를 이용해 날짜를 비교하는 방법을 예제 코드와 함께 살펴봅니다.


1. LocalDate 클래스 사용하기

java.time.LocalDate 클래스는 시간대(time zone) 정보 없이 연도·월·일만 표현하는 현지 날짜를 나타냅니다. Java 8부터 도입된 java.time API의 핵심 클래스로, 기존의 Date 클래스보다 직관적이고 안전하게 날짜를 다룰 수 있어 현재 가장 권장되는 방식입니다.

이 클래스는 두 날짜를 비교하기 위해 isBefore(), isAfter(), isEqual() 메서드를 제공합니다.

예제 코드

import java.time.LocalDate;

public class Sample {
    public static void main(String args[]) {
        LocalDate date1 = LocalDate.of(2007, 11, 25);
        LocalDate date2 = LocalDate.of(1999, 9, 12);

        Boolean bool1 = date1.isAfter(date2);
        Boolean bool2 = date1.isBefore(date2);
        Boolean bool3 = date1.isEqual(date2);

        if (bool1) {
            System.out.println(date1 + " is after " + date2);
        } else if (bool2) {
            System.out.println(date1 + " is before " + date2);
        } else if (bool3) {
            System.out.println(date1 + " is equal to " + date2);
        }
    }
}

실행 결과

2007-11-25 is after 1999-09-12

2. Date 클래스 사용하기

java.util.Date 클래스는 특정 시점(instant)을 밀리초 단위로 표현하며, before(), after(), equals() 메서드를 통해 두 날짜를 비교할 수 있습니다. 문자열을 Date 객체로 변환하려면 SimpleDateFormat을 함께 사용합니다.

참고: 날짜 패턴은 반드시 "yyyy-MM-dd"처럼 연도-월-일 순서로 지정해야 합니다. 패턴 순서가 잘못되면 의도하지 않은 날짜가 파싱될 수 있습니다.

예제 코드

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Sample {
    public static void main(String args[]) throws ParseException {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

        // 문자열을 Date 객체로 파싱
        Date date1 = formatter.parse("2007-11-25");
        Date date2 = formatter.parse("1999-09-12");

        Boolean bool1 = date1.after(date2);
        Boolean bool2 = date1.before(date2);
        Boolean bool3 = date1.equals(date2);

        if (bool1) {
            System.out.println(date1 + " is after " + date2);
        } else if (bool2) {
            System.out.println(date1 + " is before " + date2);
        } else if (bool3) {
            System.out.println(date1 + " is equal to " + date2);
        }
    }
}

실행 결과

Sun Nov 25 00:00:00 KST 2007 is after Sun Sep 12 00:00:00 KST 1999

출력 형식은 프로그램이 실행되는 환경의 시간대 설정에 따라 달라질 수 있습니다.

3. Calendar 클래스 사용하기

java.util.Calendar 클래스 역시 Date 클래스와 마찬가지로 before(), after(), equals() 메서드를 제공하여 두 날짜를 비교할 수 있습니다. 단, Calendar 객체를 그대로 출력하면 내부 상태 정보가 모두 노출되므로, getTime() 메서드로 Date 객체를 얻어 출력하는 것이 좋습니다.

예제 코드

import java.util.Calendar;

public class Sample {
    public static void main(String args[]) {
        Calendar obj1 = Calendar.getInstance();
        obj1.set(2007, 11, 25);   // 월(month)은 0부터 시작하므로 11은 12월

        Calendar obj2 = Calendar.getInstance();
        obj2.set(1999, 9, 15);    // 10월 15일

        Boolean bool1 = obj1.after(obj2);
        Boolean bool2 = obj1.before(obj2);
        Boolean bool3 = obj1.equals(obj2);

        if (bool1) {
            System.out.println(obj1.getTime() + " is after " + obj2.getTime());
        } else if (bool2) {
            System.out.println(obj1.getTime() + " is before " + obj2.getTime());
        } else if (bool3) {
            System.out.println(obj1.getTime() + " is equal to " + obj2.getTime());
        }
    }
}

실행 결과

Tue Dec 25 21:33:47 KST 2007 is after Fri Oct 15 21:33:47 KST 1999

어떤 방법을 선택해야 할까?

세 가지 방법을 요약하면 다음과 같습니다.

  • LocalDate: Java 8 이상이라면 가장 권장되는 방식입니다. 불변 객체로 스레드에 안전하고, 시간 정보 없이 순수한 날짜만 비교할 수 있습니다.
  • Date: 레거시 코드나 외부 라이브러리와의 호환성이 필요할 때 사용합니다. 가변 객체라는 점에 유의해야 합니다.
  • Calendar: 특정 필드(연도, 월 등)를 개별적으로 조작해야 하는 경우에 유용하지만, 월이 0부터 시작한다는 점 등 실수하기 쉬운 부분이 많습니다.

새로운 프로젝트라면 가독성과 안전성이 뛰어난 LocalDate를 우선적으로 사용하는 것이 좋습니다.