어제 오늘 내일

[Java] 날짜 비교하기 ( LocalDate, LocalDateTime, Date, Calendar) 본문

IT/Java

[Java] 날짜 비교하기 ( LocalDate, LocalDateTime, Date, Calendar)

hi.anna 2021. 6. 19. 17:17

Java API를 이용하여 날짜와 시간을 다루는 방법을 알아보고 있습니다.

[Java] 현재 날짜, 현재 시간 구하기

[Java] 문자열을 날짜로 변환하기 (Date, LocalDateTime)

[Java] 특정 날짜의 요일 구하기 (숫자, 영문, 한글)

 

이번에는, 2개의 날짜를 비교하는 방법을 알아보도록 하겠습니다.

Java 8 이후

  1. LocalDate
  2. LocalDateTime
  3. LocalDate와 LocalDateTime 비교하기
  4. LocalDateTime에서 년, 월, 일, 시간, 분 단위까지만 비교하기

Java 8 이전

  1. Date
  2. Calendar

 

  Java 8 이후  

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(2021, 6, 19);
        LocalDate date2 = LocalDate.of(2021, 6, 20);
        LocalDate date3 = LocalDate.of(2021, 6, 20);

        // 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

public boolean isAfter(ChronoLocalDateTime<?> other)
public boolean isBefore(ChronoLocalDateTime<?> other)
public boolean isEqual(ChronoLocalDateTime<?> other)
public int compareTo(ChronoLocalDateTime<?> other)

LocalDateTime 클래스도 LocalDate 클래스와 마찬가지로

날짜와 시간 비교를 위해 위와 같은 메소드를 사용할 수 있습니다.

LocalDateTime의 isAfter(), isBefore(), isEqual(), compareTo() 메소드는

날짜와 시간단위까지 비교합니다.

 

  예제  

import java.time.LocalDateTime;

public class LocalDateTimeCompare {
    public static void main(String[] args) {
        LocalDateTime date1 = LocalDateTime.of(2021, 6, 19, 1, 12, 0);
        LocalDateTime date2 = LocalDateTime.of(2021, 6, 19, 1, 12, 1);
        LocalDateTime date3 = LocalDateTime.of(2021, 6, 19, 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 비교하기

import java.time.LocalDate;
import java.time.LocalDateTime;

public class LocalDateCompareLocalDateTime {

    public static void main(String[] args) {
        LocalDate date1 = LocalDate.of(2021, 6, 19);
        LocalDateTime date2 = LocalDateTime.of(2021, 6, 19, 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

    }
}

LocalDate와 LocalDateTime을 비교할 때는

LocalDateTime을 LocalDate로 변환하여 비교할 수 있습니다.

그러면, 시간 정보는 무시하고, 날짜 정보만으로 두 객체의 날짜를 비교할 수 있습니다.

 

 

4. LocalDateTime에서 날짜, 시간, 분 단위로 비교하기

  예제  

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class LocalDateTimeTruncateCompare {
    public static void main(String[] args) {

        // 1. 일단위 비교
        LocalDateTime date1 = LocalDateTime.of(2021, 6, 19, 1, 15, 0);
        LocalDateTime date2 = LocalDateTime.of(2021, 6, 19, 4, 15, 30);

        compareDay(date1, date2);

        // 2. 시간 단위 비교
        LocalDateTime date3 = LocalDateTime.of(2021, 6, 19, 4, 15, 0);
        LocalDateTime date4 = LocalDateTime.of(2021, 6, 19, 4, 20, 30);

        compareHour(date3, date4);

        // 3. 분 단위 비교
        LocalDateTime date5 = LocalDateTime.of(2021, 6, 19, 4, 15, 0);
        LocalDateTime date6 = LocalDateTime.of(2021, 6, 19, 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;
    }
}

date1.truncatedTo(ChronoUnit.DAYS);

date1.truncatedTo(ChronoUnit.HOURS);

date1.truncatedTo(ChronoUnit.MINUTES);

public LocalDateTime truncatedTo(TemporalUnit unit)

LocalDateTime의 truncatedTo() 메소드는 

파라미터로 지정된 단위 이후의 값들을 버린 후,

복사한 LocalDateTime 객체를 리턴합니다.

이때, 파라미터로 전달되는 단위는 ChronoUnit 클래스에 지정된 상수를 사용하며,

DAYS보다 큰 단위인 YEARS, MONTHS 등의 값은 허용되지 않습니다.

파라미터로 DAYS보다 큰 단위를 전달하면 다음 exception이 발생합니다.

java.time.temporal.UnsupportedTemporalTypeException: Unit is too large to be used for truncation

 

위 예제에서는 각 단위별로 비교를 하기 위해서

truncatedTo() 메소드를 사용하여 

LocalDateTime 객체를 원하는 단위(일, 시간, 분)로 변환한 후,

두 객체를 비교하였습니다.

 

 

  Java 8 이전  

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 anotherDate)

주어진 날짜가,

파라미터로 전달받은 날짜와 같을 경우 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("2021-06-19 01:15:10");
        Date date2 = formatter.parse("2021-06-19 01:15:11");
        Date date3 = formatter.parse("2021-06-19 01: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

public boolean after(Object when)
public boolean before(Object when)
public boolean equals(Object obj)
public int compareTo(Calendar anotherCalendar)

Calendar 클래스 역시

java.util.Date 클래스와 비슷한 비교 메소드들을 가지고 있습니다.

 

  예제  

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("2021-06-19 01:15:10");
        Date date2 = formatter.parse("2021-06-19 01:15:11");
        Date date3 = formatter.parse("2021-06-19 01: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
    }
}

 


 

Java API를 이용하여

날짜를 비교하는 방법을 알아보았습니다.

 

 

반응형
Comments