[JAVA] 날짜 비교하기(Date, Calendar, LocalDate, LocalDateTime)
JAVA 버전에 따라 날짜 비교하는 방법이 다릅니다.
JAVA8 이전
1. Date
java.util.Date 클래스를 이용하여 날짜를 비교할 수 있습니다.
public boolean after(Date when)
- 주어진 날짜가 매개변수로 전달받은 날짜보다 클 경우 true를 리턴하게 됩니다.
public boolean before(Date when)
- 주어진 날짜가 매개변수로 전달받은 날짜보다 작을 경우 true를 리턴하게 됩니다.
public boolean equals(Object obj)
- 주어진 날짜가 매개변수로 전달받은 날짜와 같을 경우 true를 리턴하게 됩니다.
public int compareTo(Date date2)
- 주어진 날짜가 매개변수로 전달받은 날짜와 같을 경우 0을 리턴
- 주어진 날짜가 매개변수로 전달받은 날짜보다 클 경우 양수를 리턴
- 주어진 날짜가 매개변수로 전달받은 날짜보다 작을 경우 음수를 리턴합니다.
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateCompare {
public static void main(String[] args) throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = formatter.parse("2022-06-13 14:15:10");
Date date2 = formatter.parse("2022-06-13 14:15:11");
Date date3 = formatter.parse("2022-06-13 14:15:11");
// after
System.out.println(date1.after(date2)); // false
System.out.println(date2.after(date3)); // false
System.out.println(date2.after(date1)); // true
// before
System.out.println(date1.before(date2)); // true
System.out.println(date2.before(date3)); // false
System.out.println(date2.before(date1)); // false
// equals
System.out.println(date1.equals(date2)); // false
System.out.println(date2.equals(date3)); // true
System.out.println(date2.equals(date1)); // false
// compareTo
System.out.println(date1.compareTo(date2)); // -1
System.out.println(date2.compareTo(date3)); // 0
System.out.println(date2.compareTo(date1)); // 1
}
}
2. Calendar
Calendar 클래스 역시 java.util.Date 클래스와 비슷한 메서드를 가지고 있습니다.
public boolean after(Object when)
- 주어진 날짜가 매개변수로 전달받은 날짜보다 클 경우 true를 리턴하게 됩니다.
public boolean before(Object when)
- 주어진 날짜가 매개변수로 전달받은 날짜보다 작을 경우 true를 리턴하게 됩니다.
public boolean equals(Object obj)
- 주어진 날짜가 매개변수로 전달받은 날짜와 같을 경우 true를 리턴하게 됩니다.
public int compareTo(Calendar calendar 2)
- 주어진 날짜가 매개변수로 전달받은 날짜와 같을 경우 0을 리턴
- 주어진 날짜가 매개변수로 전달받은 날짜보다 클 경우 양수를 리턴
- 주어진 날짜가 매개변수로 전달받은 날짜보다 작을 경우 음수를 리턴합니다.
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class CalendarCompare {
public static void main(String[] args) throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = formatter.parse("2022-06-13 14:15:10");
Date date2 = formatter.parse("2022-06-13 14:15:11");
Date date3 = formatter.parse("2022-06-13 14:15:11");
// Calendar 객체 생성
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
Calendar calendar3 = Calendar.getInstance();
calendar1.setTime(date1);
calendar2.setTime(date2);
calendar3.setTime(date3);
// after
System.out.println(calendar1.after(calendar2)); // false
System.out.println(calendar2.after(calendar3)); // false
System.out.println(calendar2.after(calendar1)); // true
// before
System.out.println(calendar1.before(calendar2)); // true
System.out.println(calendar2.before(calendar3)); // false
System.out.println(calendar2.before(calendar1)); // false
// equals
System.out.println(calendar1.equals(calendar2)); // false
System.out.println(calendar2.equals(calendar3)); // true
System.out.println(calendar2.equals(calendar1)); // false
// compareTo
System.out.println(calendar1.compareTo(calendar2)); // -1
System.out.println(calendar2.compareTo(calendar3)); // 0
System.out.println(calendar2.compareTo(calendar1)); // 1
}
}
JAVA8 이후
1. LocalDate
public boolean isAfter(ChronoLocalDate other)
- 주어진 날짜가, 매개변수로 전달받은 날짜보다 클 경우 true를 리턴합니다.
public boolean isBefore(ChronoLocalDate other)
- 주어진 날짜가, 매개변수로 전달받은 날짜보다 작을 경우 true를 리턴합니다.
public boolean isEqual(ChronoLocalDate other)
- 주어진 날짜가, 매개변수로 전달받은 날짜와 같을 경우 true를 리턴합니다.
public int compareTo(ChronoLocalDate other)
- 주어진 날짜가 매개변수로 전달받은 날짜와 같을 경우 0 리턴
- 매개변수로 전달받은 날짜보다 클 경우 양수 리턴
- 매개변수로 전달받은 날짜보다 작을 경우 음수 리턴
import java.time.LocalDate;
public class LocalDateCompare {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2022, 6, 13);
LocalDate date2 = LocalDate.of(2022, 6, 14);
LocalDate date3 = LocalDate.of(2022, 6, 14);
// isAfter()
System.out.println(date1.isAfter(date2)); // false
System.out.println(date2.isAfter(date3)); // false
System.out.println(date2.isAfter(date1)); // true
// isBefore()
System.out.println(date1.isBefore(date2)); // true
System.out.println(date2.isBefore(date3)); // false
System.out.println(date2.isBefore(date1)); // false
// isEqual()
System.out.println(date1.isEqual(date2)); // false
System.out.println(date2.isEqual(date3)); // true
System.out.println(date2.isEqual(date1)); // false
// compareTo()
System.out.println(date1.compareTo(date2)); // -1
System.out.println(date2.compareTo(date3)); // 0
System.out.println(date2.compareTo(date1)); // 1
}
}
2. LocalDateTime
LocalDateTime 클래스도 LocalDate 클래스와 같이 날짜와 시간 비교를 위해 다음과 같은 메서드를 사용할 수 있습니다.
LocalDateTime의
isAfter()
isBefore()
isEqual()
compareTo()
메서드는 날짜와 시간단위까지 비교할수 있습니다.
import java.time.LocalDateTime;
public class LocalDateTimeCompare {
public static void main(String[] args) {
LocalDateTime date1 = LocalDateTime.of(2022, 6, 13, 1, 12, 0);
LocalDateTime date2 = LocalDateTime.of(2022, 6, 13, 1, 12, 1);
LocalDateTime date3 = LocalDateTime.of(2022, 6, 13, 1, 12, 1);
// isAfter
System.out.println(date1.isAfter(date2)); // false
System.out.println(date2.isAfter(date3)); // false
System.out.println(date2.isAfter(date1)); // true
// isBefore
System.out.println(date1.isBefore(date2)); // true
System.out.println(date2.isBefore(date3)); // false
System.out.println(date2.isBefore(date1)); // false
// isEqual
System.out.println(date1.isEqual(date2)); // false
System.out.println(date2.isEqual(date3)); // true
System.out.println(date2.isEqual(date1)); // false
// compareTo
System.out.println(date1.compareTo(date2)); // -1
System.out.println(date2.compareTo(date3)); // 0
System.out.println(date2.compareTo(date1)); // 1
}
}
3. LocalDate와 LocalDateTime 비교
LocalDate와 LocalDateTime을 비교할 땐, LocalDateTime을 LocalDate로 변환하여 비교할 수 있습니다.
그렇게 되면, 시간 정보는 무시하고, 날짜 정보만으로 두 객체의 날짜를 비교할 수 있습니다.
import java.time.LocalDate;
import java.time.LocalDateTime;
public class LocalDateCompareLocalDateTime {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2022, 6, 13);
LocalDateTime date2 = LocalDateTime.of(2022, 6, 13, 1, 23, 0);
System.out.println(date1.isEqual(date2.toLocalDate())); // true
System.out.println(date1.isBefore(date2.toLocalDate())); // false
System.out.println(date1.isAfter(date2.toLocalDate())); // false
}
}
4. LocalDateTime에서 날짜, 시간, 분 단위로 비교
LocalDateTime의 truncatedTo() 메소드는 매개변수로 지정된 단위 이후의 값들을 버린 후,
복사한 LocalDateTime 객체를 리턴합니다.
이때, 매개변수로 전달되는 단위는 ChronoUnit 클래스에 지정된 상수를 사용하며 ,
DAYS보다 큰 단위인 YEARS, MONTHS 등의 값은 허용되지 않습니다.
매개변수로 DAYS보다 큰 단위를 전달하면 다음과 같은 exception이 발생합니다.
java.time.temporal.UnsupportedTemporalTypeException: Unit is too large to be used for truncation
아래 예제에서는 각 단위별로 비교를 하기 위해 truncatedTo() 메서드를 사용하여
LocalDateTime 객체를 원하는 단위(일, 시간, 분)로 변환한 후 두 객체를 비교하였습니다.
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class LocalDateTimeTruncateCompare {
public static void main(String[] args) {
// 1. 일단위 비교
LocalDateTime date1 = LocalDateTime.of(2022, 6, 13, 1, 15, 0);
LocalDateTime date2 = LocalDateTime.of(2022, 6, 19, 4, 15, 30);
compareDay(date1, date2);
// 2. 시간 단위 비교
LocalDateTime date3 = LocalDateTime.of(2022, 6, 13, 4, 15, 0);
LocalDateTime date4 = LocalDateTime.of(2022, 6, 13, 4, 20, 30);
compareHour(date3, date4);
// 3. 분 단위 비교
LocalDateTime date5 = LocalDateTime.of(2022, 6, 13, 4, 15, 0);
LocalDateTime date6 = LocalDateTime.of(2022, 6, 13, 4, 15, 30);
compareMinute(date5, date6);
}
public static int compareDay(LocalDateTime date1, LocalDateTime date2) {
LocalDateTime dayDate1 = date1.truncatedTo(ChronoUnit.DAYS);
LocalDateTime dayDate2 = date1.truncatedTo(ChronoUnit.DAYS);
int compareResult = dayDate1.compareTo(dayDate2);
System.out.println("=== 일 단위 비교 ===");
System.out.println("date1.truncatedTo(ChronoUnit.DAYS) : " + dayDate1);
System.out.println("date2.truncatedTo(ChronoUnit.DAYS) : " + dayDate2);
System.out.println("결과 : " + compareResult);
return compareResult;
}
public static int compareHour(LocalDateTime date1, LocalDateTime date2) {
LocalDateTime dayDate1 = date1.truncatedTo(ChronoUnit.HOURS);
LocalDateTime dayDate2 = date1.truncatedTo(ChronoUnit.HOURS);
int compareResult = dayDate1.compareTo(dayDate2);
System.out.println("=== 시간 단위 비교 ===");
System.out.println("date1.truncatedTo(ChronoUnit.HOURS) : " + dayDate1);
System.out.println("date2.truncatedTo(ChronoUnit.HOURS) : " + dayDate2);
System.out.println("결과 : " + compareResult);
return compareResult;
}
public static int compareMinute(LocalDateTime date1, LocalDateTime date2) {
LocalDateTime dayDate1 = date1.truncatedTo(ChronoUnit.MINUTES);
LocalDateTime dayDate2 = date1.truncatedTo(ChronoUnit.MINUTES);
int compareResult = dayDate1.compareTo(dayDate2);
System.out.println("=== 분 단위 비교 ===");
System.out.println("date1.truncatedTo(ChronoUnit.MINUTES) : " + dayDate1);
System.out.println("date2.truncatedTo(ChronoUnit.MINUTES) : " + dayDate2);
System.out.println("결과 : " + compareResult);
return compareResult;
}
}