2017-04-21 75 views
0

我想比較兩個日曆對象與他們的日期。Java /安卓:字面上比較日期的2日曆對象

我的代碼:

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

c1.set(2017, 1,2); 
c2.set(2017, 1,1); 

int compared = c1.compareTo(c2); 

textView.setText("" + compared); 

結果應該是-1或1,其中,我的情況應該是一個int:-1。

但是,這不是我想要的結果。我想能夠比較日期直接說:

01/20/2010 compared to 02/30/2014 returns true or false. 

有一些方法來實現這個基於日曆lib?

我知道建立在諸如getDay(),getMonth(),equals()等方法。問題是,在使用getDay(),getMonth(),getYear()時,我比較3個int時很難進行比較。

此外,我有一種感覺,要比較兩個日期之間,我將不得不將時區和timeinMillis設置爲相同。意思是比較直接的日期,對於cal1和cal2,它的時區和timeinmillis必須是相同的。

有人可以向我澄清這件事嗎?

+0

從[文檔:的compareTo()](http://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html#compareTo-java.util。如果參數所表示的時間等於該日曆所表示的時間,則日曆 - )返回「0值」。如果此日曆的時間在參數所代表的時間之前,則值小於0;如果此日曆的時間在參數所代表的時間之後,則該值大於0.「*請不要指望它是-1還是1. –

+0

您想要的結果是什麼?對於第一個比第二個更早的情況,這應該是相同的還是正確的?要麼…? –

回答

1

TL;博士

LocalDate.of(2010 , 1 , 20) 
     .isBefore( 
      LocalDate.of(2014 , 2 , 30) 
     ) 

真正

詳細

您使用了錯誤的類錯誤的方法。

Calendar類代表日期時間。但是你想要一個沒有日期的日期值。

您正在調用compareTo方法,該方法由特定接口Comparable定義並具有特定用途。此方法旨在返回整數,而您需要「isBefore」或「isAfter」的布爾結果。

使用java.time

而且,麻煩Calendar類是現在傳統的舊日期時間類,由java.time類取代之一。

LocalDate類代表沒有時間和不帶時區的僅有日期的值。

LocalDate ld1 = LocalDate.of(2010 , 1 , 20) ; 
LocalDate ld2 = LocalDate.of(2014 , 2 , 30) ; 

與布爾方法比較。

boolean ld1IsBefore = ld1.isBefore(ld2); 
boolean ld1IsAfter = ld1.isAfter(ld2); 
boolean ld1IsEqual = ld1.isEqual(ld2); 

關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

0

你能做到這樣

textView.setText("c1 compared to c2 returns " + (c1.compareTo(c2) == 0)); 

按照兩個Calendar對象表示的javadoc

(從曆元的毫秒偏移量)比較時間值。

測試

 Calendar c1 = Calendar.getInstance(); 
     Calendar c2 = Calendar.getInstance(); 
     c2.add(Calendar.MINUTE, 1); 

     System.out.println ("c1 compared to c2 returns " + (c1.compareTo(c2) == 0)); 
1

你可以使用任何Calendar#beforeCalendar#after,使返回一個boolean的比較。

SimpleDateFormat formatC1 = new SimpleDateFormat("yyyy-MM-dd"); 
String formattedC1 = formatC1.format(c1.getTime()); 
SimpleDateFormat formatC2 = new SimpleDateFormat("yyyy-MM-dd"); 
String formattedC2 = formatC2.format(c2.getTime()); 
textView.setText(formattedC1 + " compared to " + formattedC2 + " returns " + c1.before(c2)); 
+0

我曾經使用過before()和after()函數!然而,它並沒有回覆我期望的答案。然而,我沒有意識到getTime()然後使用SimpleDateTimeFormatter對其進行格式化就可以了!感謝您的所有答案。 –

2

你應該從概念觀點謹慎有:的compareTo()有返回一個int,與非常特殊的意義 - 1,0,1結果告訴你關於如何訂購比較對象。

您正在尋找的布爾結果表明您應該在使用之前或之後使用類似動詞的思維/說話!

這是一個壞主意,採取一個明確的概念,保留名稱,但改變涵蓋下的意義!