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.Date
나 java.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
직접 사용하는 것이 좋습니다 ( YearMonthDay 및 DateTime 클래스 참조 ).
그러나 사용하고 싶다면 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