[java] 시간 부분없이 두 날짜를 비교하는 방법은 무엇입니까?

java.util.Date의 시간 부분을 무시하는 compareTo 메소드를 갖고 싶습니다. 이 문제를 해결하는 방법에는 여러 가지가 있다고 생각합니다. 가장 간단한 방법은 무엇입니까?



답변

업데이트 : 당시 Joda Time은 권장 사항 이었지만 java.time가능한 경우 Java 8 이상 라이브러리를 사용하십시오 .


내가 선호하는 것은 Joda Time 을 사용 하는 것입니다.

DateTime first = ...;
DateTime second = ...;

LocalDate firstDate = first.toLocalDate();
LocalDate secondDate = second.toLocalDate();

return firstDate.compareTo(secondDate);

편집 : 의견에서 언급했듯이 사용 DateTimeComparator.getDateOnlyInstance()하면 훨씬 간단합니다 🙂

// TODO: consider extracting the comparator to a field.
return DateTimeComparator.getDateOnlyInstance().compare(first, second);

( “사용 Joda 시간”에 대해 물어 거의 모든 SO 질문의 기초 java.util.Datejava.util.Calendar. 그것은 철저하게 우수한 API입니다. 당신이하고있는 경우 어떤 날짜 / 시간으로 의미를 당신이 가능하게 할 수있는 경우에, 당신이 정말로 그것을 사용해야합니다.)

당신이 절대적으로하는 경우 강제 (가) API에 내장 된 사용하려면 인스턴스 생성해야 Calendar적절한 날짜 및 적절한 시간대를 사용합니다. 그런 다음 각 달력의 각 필드를 시간, 분, 초 및 밀리 초에서 0으로 설정하고 결과 시간을 비교할 수 있습니다. 확실히 Joda 솔루션과 비교하여 icky 🙂

시간대 부분이 중요하다는 : java.util.Date되어 항상 UTC 기준으로합니다. 날짜에 관심이있는 대부분의 경우 특정 시간대 의 날짜 였습니다 . 그 자체로 당신이 Calendar또는 Joda Time 을 사용하도록 강요 할 것입니다 (당신이 시간대를 직접 설명하고 싶지 않다면, 나는 권장하지 않습니다).

안드로이드 개발자를위한 빠른 참조

//Add joda library dependency to your build.gradle file
dependencies {
     ...
     implementation 'joda-time:joda-time:2.9.9'
}

샘플 코드 (예)

DateTimeComparator dateTimeComparator = DateTimeComparator.getDateOnlyInstance();

Date myDateOne = ...;
Date myDateTwo = ...;

int retVal = dateTimeComparator.compare(myDateOne, myDateTwo);

if(retVal == 0)
   //both dates are equal
else if(retVal < 0)
   //myDateOne is before myDateTwo
else if(retVal > 0)
   //myDateOne is after myDateTwo


답변

Apache commons-lang 은 거의 어디에나 있습니다. 이건 어때?

if (DateUtils.isSameDay(date1, date2)) {
    // it's same
} else if (date1.before(date2)) {
   // it's before
} else {
   // it's after
}


답변

java.util.Date를 실제로 사용하려면 다음과 같이하십시오.

public class TimeIgnoringComparator implements Comparator<Date> {
  public int compare(Date d1, Date d2) {
    if (d1.getYear() != d2.getYear()) 
        return d1.getYear() - d2.getYear();
    if (d1.getMonth() != d2.getMonth()) 
        return d1.getMonth() - d2.getMonth();
    return d1.getDate() - d2.getDate();
  }
}

또는 대신 달력을 사용하십시오 (getYear () 등이 더 이상 사용되지 않기 때문에 선호됩니다)

public class TimeIgnoringComparator implements Comparator<Calendar> {
  public int compare(Calendar c1, Calendar c2) {
    if (c1.get(Calendar.YEAR) != c2.get(Calendar.YEAR)) 
        return c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
    if (c1.get(Calendar.MONTH) != c2.get(Calendar.MONTH)) 
        return c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH);
    return c1.get(Calendar.DAY_OF_MONTH) - c2.get(Calendar.DAY_OF_MONTH);
  }
}


답변

Joda가 날짜와 시간을 구분 하기 때문에 Joda 라이브러리를 java.util.Date직접 사용하는 것이 좋습니다 ( YearMonthDayDateTime 클래스 참조 ).

그러나 사용하고 싶다면 java.util.Date유틸리티 메소드를 작성하는 것이 좋습니다. 예 :

public static Date setTimeToMidnight(Date date) {
    Calendar calendar = Calendar.getInstance();

    calendar.setTime( date );
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);

    return calendar.getTime();
}


답변

이 대안에 대한 의견이 있으십니까?

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));


답변

두 날짜의 월, 일 및 연도 만 비교하려면 다음 코드가 적합합니다.

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));

고마워 Rob.


답변

나도 Joda Time을 선호 하지만 대안은 다음과 같습니다.

long oneDay = 24 * 60 * 60 * 1000
long d1 = first.getTime() / oneDay
long d2 = second.getTime() / oneDay
d1 == d2

편집하다

UTC 이외의 특정 시간대의 날짜를 비교해야 할 경우를 대비하여 UTC를 아래에 두었습니다. 그래도 그런 필요가 있다면 Joda를 추천합니다.

long oneDay = 24 * 60 * 60 * 1000
long hoursFromUTC = -4 * 60 * 60 * 1000 // EST with Daylight Time Savings
long d1 = (first.getTime() + hoursFromUTC) / oneDay
long d2 = (second.getTime() + hoursFromUTC) / oneDay
d1 == d2