2011-10-06 216 views
27

在給定兩個Date對象的情況下,如何比較兩個日期對象之間的差異,完全忽略年,月和日?只比較兩個日期的時間部分,忽略日期部分

這與this question完全相反。

UPDATE:這裏以供將來參考最終代碼:

private long differenceBetween(Date currentTime, Date timeToRun) 
{ 
    Calendar currentCal = Calendar.getInstance(); 
    currentCal.setTime(currentTime); 

    Calendar runCal = Calendar.getInstance(); 
    runCal.setTime(timeToRun); 
    runCal.set(Calendar.DAY_OF_MONTH, currentCal.get(Calendar.DAY_OF_MONTH)); 
    runCal.set(Calendar.MONTH, currentCal.get(Calendar.MONTH)); 
    runCal.set(Calendar.YEAR, currentCal.get(Calendar.YEAR)); 

    return currentCal.getTimeInMillis() - runCal.getTimeInMillis(); 
} 
+2

是的,它的作用。爲什麼不呢? – kolrie

+0

這個解決方案的諷刺之處在於,你需要在long類型的基元周圍使用兩個薄的包裝器對象,調用一個龐大而複雜的API來將多個元素轉換爲Calendar對象...只能最終返回到某個地方,重新從Calendar對象轉換爲長整型。 – scottb

+0

@scottb - 請參閱下面的[我的答案](http://stackoverflow.com/questions/7676149#7676307),它不會混淆「日曆」對象,但只使用「日期」成員。 –

回答

29

如果你想比較底層的二進制(長整型)的日期值,你可以這樣做:

public int compareTimes(Date d1, Date d2) 
{ 
    int  t1; 
    int  t2; 

    t1 = (int) (d1.getTime() % (24*60*60*1000L)); 
    t2 = (int) (d2.getTime() % (24*60*60*1000L)); 
    return (t1 - t2); 
} 

附錄1

這種技術具有速度優勢,因爲它直接使用Date對象的基礎long值,而不是在滴答和日曆組件之間轉換(這相當昂貴且速度慢)。這也比對Calendar對象簡單得多。

附錄2

上面的代碼返回的時間差作爲int,這將是任何對次正確的,因爲它忽略日期的年/月/日的部分完全和任何兩次之間的差值不超過86,400,000  ms(=  1000ms/sec × 60秒/分鐘×60分鐘/小時×24小時/天)。

+0

這是最好的答案,imo。不需要使用複雜的Calendar API來比較Date對象中的時間值。 – scottb

+0

這是完美和智能 –

+0

thnx大衛,正是我在找:) :) –

5

看看在Calendar類。它支持從給定的Date提取小時,分鐘和秒鐘。

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(yourDateObject); 
int hour = calendar.get(Calendar.HOUR); 
int minute = calendar.get(Calendar.MINUTE); 
int second = calendar.get(Calendar.SECOND); 
+0

Calendar.HOUR_OF_DAY更合適(24小時而不是12) – IHeartAndroid

1

如果你不能使用JODA,

創建2個日曆對象,設置年,月,日,以0

比較他們....

19

您可能考慮使用喬達時間的DateTimeComparator.getTimeOnlyInstance()作比較器,比較器僅根據時間比較兩個喬達日期。

例如:

DateTimeComparator comparator = DateTimeComparator.getTimeOnlyInstance(); 
comparator.compare(date1, date2); 

http://joda-time.sourceforge.net/api-release/org/joda/time/DateTimeComparator.html#getTimeOnlyInstance()

+0

如果(java)時間是問題,JODA是答案:D – bbaja42

+0

@ bbaja42不是你使用GWT:/ – displayname

1

如果JODA不是一個選項,最短的方法之一可能是將時間轉換爲字符串,然後比較它們。

DateFormat df = new SimpleDateFormat("HHmmssSZ"); 
df.format(date1).equals(df.format(date2)); 
0

不知道該怎麼好實踐或efficent是這一個,但我一直在使用日期對象,擔任我的目的而編寫一個簡單的函數。它返回一個真或假的第一個日期值比第二個大。輸入d1 & & d2是Date對象。

function CompareTimes(d1, d2) { 
      if (d1.getHours() < d2.getHours()) { 
       return false; 
      } 
      if (d1.getHours() > d2.getHours()) { 
       return true; 

      } else { 
       return (d1.getMinutes() > d2.getMinutes()); 
      } 
}; 
0

,如果你只是想日期的時間部分比較那麼這會給你正確的結果 -

public long compareTimes(Date d1, Date d2) 
    { 
     long  t1; 
     long  t2; 
     t1 = d1.getHours()*60*60+d1.getMinutes()*60+d1.getSeconds(); 
     t2 = d2.getHours()*60*60+d2.getMinutes()*60+d2.getSeconds(); 
     long diff = t1-t2; 
     System.out.println("t1 - "+t1+", t2 - "+t2+", diff - "+diff); 

     return diff; 
    }