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

자바(Java)에서 문자열 형식의 두 날짜를 비교하는 방법

자바에서 날짜 정보는 대체로 문자열 형태로 입력되거나 전달됩니다. 따라서 두 날짜의 선후 관계를 판단하려면 먼저 문자열을 Date 또는 LocalDate 객체로 변환(파싱)한 뒤 비교해야 합니다. 이 글에서는 대표적인 두 가지 방법을 예제 코드와 함께 살펴봅니다.

1. SimpleDateFormat 클래스를 이용한 비교

java.text.SimpleDateFormat 클래스는 문자열을 날짜로 변환하거나(parsing), 날짜를 원하는 형식의 문자열로 변환(formatting)할 때 사용되는 대표적인 클래스입니다.

  • 생성자에 원하는 날짜 형식을 나타내는 문자열(예: "yyyy-MM-dd")을 전달하여 SimpleDateFormat 객체를 생성합니다.
  • parse() 메서드를 호출하면 지정한 형식에 맞춰 날짜 문자열이 Date 객체로 변환됩니다.
  • java.util.Date 클래스는 특정 시점(instant)을 표현하며, 두 날짜를 비교할 수 있는 before(), after(), equals() 메서드를 제공합니다.

예제 코드

문자열로부터 Date 객체를 생성한 후에는 아래와 같이 세 가지 메서드 중 하나를 사용해 두 날짜를 비교할 수 있습니다.

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

public class Demo {
    public static void main(String args[]) throws ParseException {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr1 = "2007-11-25";
        String dateStr2 = "1999-09-12";

        // 주어진 문자열을 Date 객체로 파싱
        Date date1 = formatter.parse(dateStr1);
        Date date2 = formatter.parse(dateStr2);

        Boolean bool1 = date1.after(date2);   // date1이 더 이후인가?
        Boolean bool2 = date1.before(date2);  // date1이 더 이전인가?
        Boolean bool3 = date1.equals(date2);  // 두 날짜가 같은가?

        if (bool1) {
            System.out.println(dateStr1 + " 은(는) " + dateStr2 + " 보다 이후의 날짜입니다.");
        } else if (bool2) {
            System.out.println(dateStr1 + " 은(는) " + dateStr2 + " 보다 이전의 날짜입니다.");
        } else if (bool3) {
            System.out.println(dateStr1 + " 과(와) " + dateStr2 + " 은(는) 같은 날짜입니다.");
        }
    }
}

실행 결과

2007-11-25 은(는) 1999-09-12 보다 이후의 날짜입니다.

2. LocalDate 클래스의 parse() 메서드 활용 (권장)

Java 8부터 도입된 java.time API를 사용하면 더 간결하고 안전하게 날짜를 다룰 수 있습니다. LocalDate 클래스의 parse() 메서드는 날짜를 나타내는 문자열을 인수로 받아 LocalDate 객체를 반환합니다. 기본적으로 ISO-8601 형식(yyyy-MM-dd)을 사용하므로, 별도의 포맷터 없이 바로 파싱할 수 있다는 장점이 있습니다.

예제 코드

import java.time.LocalDate;

public class Test {
    public static void main(String args[]){
        String dateStr1 = "2007-11-25";
        String dateStr2 = "1999-09-12";

        // 문자열을 LocalDate 객체로 파싱
        LocalDate date1 = LocalDate.parse(dateStr1);
        LocalDate date2 = LocalDate.parse(dateStr2);

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

        if (bool1) {
            System.out.println(dateStr1 + " 은(는) " + dateStr2 + " 보다 이후의 날짜입니다.");
        } else if (bool2) {
            System.out.println(dateStr1 + " 은(는) " + dateStr2 + " 보다 이전의 날짜입니다.");
        } else if (bool3) {
            System.out.println(dateStr1 + " 과(와) " + dateStr2 + " 은(는) 같은 날짜입니다.");
        }
    }
}

실행 결과

2007-11-25 은(는) 1999-09-12 보다 이후의 날짜입니다.

정리 및 참고 사항

  • 레거시 코드 유지보수가 아니라면 스레드에 안전하고 직관적인 java.time.LocalDate 사용을 권장합니다. 반면 SimpleDateFormat은 스레드에 안전하지 않아 멀티스레드 환경에서 주의가 필요합니다.
  • LocalDate.parse()는 "1999-9-12"처럼 월·일이 한 자리인 문자열은 처리하지 못하므로, 항상 두 자리("1999-09-12")로 맞춰주어야 합니다.
  • 형식이 다른 문자열을 파싱해야 한다면 DateTimeFormatter.ofPattern("yyyy.MM.dd")과 같이 커스텀 포맷터를 정의해 사용할 수 있습니다.