2014-04-30 2 views
0

날짜가 미래 또는 현재 인 경우 다음 메서드는 true을 반환해야합니다. 날짜는 10 May 2014 또는 30 Apr 2014 일 수 있지만 과거에는 설정할 수 없습니다. 이것을 확인하는 올바른 방법은 무엇입니까? 이 방법은 때때로 잘못된 결과를냅니다.날짜가 과거로 설정되지 않았는지 확인하는 방법은 무엇입니까?

public boolean isDateOk(java.sql.Date date) { 
    boolean isOk = false; 
    if(new GregorianCalendar().getTimeInMillis() <= date.getTime()) isOk = true; 
    return isOk; 
} 
+0

구체적으로 작성하십시오. 언제 잘못된 결과가 나옵니까? –

+0

@ErwinBolwidt'2014-04-30' – saplingPro

답변

3

이유는 단지 http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#setTime(java.util.Date)

다음 YEARDAY_OF_YEAR에 대한 get을 사용하여 비교 setTime을 사용하여, 당신은 또한 달력 클래스를 사용할 수있는 before 방법

http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#before(java.util.Date)

public boolean isDateOk(java.sql.Date date) { 

    return (new java.util.Date().before (date.getTime())); 

} 

를 사용하지

Calendar now = Calendar.getIntance(); 
Calendar dt = Calendar.getIntance(); 
dt.setTime (date.getIme()); 

int nowYear = now.get(Calendar.YEAR); 
int dtYear = dt.get(Calendar.YEAR); 
int nowDOY = now.get(Calendar.DAY_OF_YEAR); 
int dtDOY = dt.get(Calendar.DAY_OF_YEAR); 

// do comparison 
+1

+1을 주었지만 부작용으로 이는 날짜와 시간 구성 요소를 비교하므로 두 개의 'Date'값이 오늘 비교에 실패 할 수 있습니다. – MadProgrammer

+0

하지만 오늘의 2 개의 날짜 값에 대해 'true'를 반환하고 싶습니다. – saplingPro

+0

그런 경우 캘린더 클래스를 사용하여 year와 day_of_year가 요구 사항에 맞는지 확인하십시오. –

1

문제는 (가능성이) 당신이 시간 정보를 가지고 있지 않습니다이 경우 데이터베이스에서 java.sql.Date를 검색하는 것입니다. getTime이 반환 한 시간 (밀리 초)은 시간대의 자정을 나타냅니다.

그러나 GregorianCalendar를 만들면 시간, 분, 초 및 밀리 초가됩니다.

그래서 현재 날짜를 비교할 때 GregorianCalendar의 SQL 날짜는 항상 밀리 초입니다.

이 문제를 해결하려면 Calendar에서 set 메서드를 호출하여 시간, 분, 초 및 밀리 초를 0으로 만들 수 있습니다. 더 나은 제안은 JodaTime에서 DateMidnight를 사용하거나 Java 8을 사용하는 경우 JodaTime의 복제본에 새로 추가 된 것입니다.

관련 문제