2014-04-30 33 views
0

如果日期是未來或現在,以下方法應該返回true。像日期可能是10 May 201430 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

爲什麼不直接使用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())); 

} 

你也可以使用日曆類,使用時刻設定 http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#setTime(java.util.Date)

然後用getYEARDAY_OF_YEAR比較

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

在這種情況下,我將使用Calendar類並驗證year和day_of_year是否在您的要求範圍內。 –

1

問題是(可能)您從數據庫中檢索到java.sql.Date,在這種情況下,它將沒有時間信息。然後getTime返回的毫秒數表示您的時區午夜。

但是,當您創建GregorianCalendar時,它將有小時,分鐘,秒和毫秒。

因此,當您比較當天的情況時,GregorianCalendar將始終比SQL日期大幾毫秒。

要解決該問題,您可以在日曆上調用set方法來將小時,分鐘,秒和毫秒歸零。 更好的建議是在JodaTime中使用DateMidnight,或者如果您有Java 8,則它是新建於JodaTime的克隆。

相關問題