2012-10-19 46 views
16

我想比較兩個日曆對象以查看它們是否都包含相同的日期。我不在乎任何價值低於幾天。比較兩個日曆對象

我實現了這一點,我可以不去想它應該會失敗無論如何:

private static boolean areEqualDays(Calendar c1, Calendar c2) { 
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); 
    return (sdf.format(c1.getTime()).equals(sdf.format(c2.getTime()))); 
} 

這是正確的做法還是應該通過現場比較,C1和C2領域?

+0

請在提問前使用您選擇的serach功能和/或搜索引擎。 – dngfng

+0

關於「比較c1和c2」http://stackoverflow.com/questions/1505496/should-i-use-calendar-compareto-to-compare-dates – manas

+1

這是一個不同的事情。我在問,如果這是一種正確的方法,或者它有缺陷,我不知道。與問如何去做並不相同。 – razielsarafan

回答

15

我實現了這一點,我可以不去想它應該會失敗無論如何

它會失敗,如果這兩個日曆是不同的時區 - 他們可以代表完全相同毫秒,但該時間可能會根據時區落入不同的日子。

如果兩個日曆表示不同的日曆系統,即使它們表示相同的「日」,如果兩個日曆表示的日期不同,也可能會失敗。

就個人而言,我會強烈建議您使用Joda Time具有LocalDate類型來表示只是一個日期 - 這將擺脫時區的問題,但不日曆系統問題。如果您始終可以假設您使用的是相同的日曆系統,那就沒問題。

(此外,僅僅爲了比較目的而執行字符串操作是醜陋的 - 我只是直接檢查calendar.get(Calendar.YEAR)等。)

+0

它們都是在應用程序中生成的,除非您在使用時跨越時區,否則它不會失敗,並且由於該應用程序僅面向西班牙,因此我並不十分關心該問題。 – razielsarafan

+1

@ santirivera92:「在應用程序中生成」並不意味着「必須以同一時區生成」 - 即使聽起來像後者是這種情況。我個人*至少*會對此發表評論......當需求發生變化時,這種情況很容易被忽略。 –

1

Calendar類有一個方法compareTo。你爲什麼不直接打電話呢?

+1

這將比較日期*和時間* ... –

+0

嗯... yes..i沒有讀的問題完全 –

40

嘗試compareTo

Calendar c1 = Calendar.getInstance(); 
Calendar c2 = Calendar.getInstance(); 
c1.compareTo(c2); 

返回

值0如果由所述參數表示的時間等於由該日曆表示的時間;如果此日曆的時間在參數所代表的時間之前,則值小於0;如果此日曆的時間在參數表示的時間之後,則該值大於0。

編輯

import org.apache.commons.lang3.time.DateUtils; 

您可以使用DateUtils.isSameDay來檢查它是否是同一天。

boolean isSameDay = DateUtils.isSameDay(c1, c2); 

2002年3月28日13:45和2002年3月28日06:01將返回true。 2002年3月28日13:45和2002年3月12日13:45將返回錯誤。

+0

那會說,今天上午10點今天是不平等時至11時 - 不像OP的方法。 OP只對* date *感興趣。 –

+0

謝謝。您的解決方案對我來說非常棒。 +1 .. –

8

可以使用somehing像DateUtils

public boolean isSameDay(Calendar cal1, Calendar cal2) { 
    if (cal1 == null || cal2 == null) 
     return false; 
    return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) 
      && cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) 
      && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR)); 
} 
1

要相對於兩個日期比較到特定字段中,首先設置低於一個到最低值的所有字段(其依賴於字段0或1 )使用Calendar.set(int field,int value),然後進行比較。 要比較cal1和cal2之間的天數差異,在調用cal1.compare(cal2)之前,您將在兩個對象上將MINUTE,SECOND和MILLISECOND設置爲0。