자바에서 날짜 정보는 대체로 문자열 형태로 입력되거나 전달됩니다. 따라서 두 날짜의 선후 관계를 판단하려면 먼저 문자열을 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")과 같이 커스텀 포맷터를 정의해 사용할 수 있습니다.