2011-08-08 67 views
1

考慮下面的代碼只確定一個Date對象的時間部分是另一個Date對象的時間部分之前:比較只有日期的時間部分

private boolean validStartStopTime(Date start, Date stop) { 
    Calendar startCal = Calendar.getInstance(); 
    Calendar stopCal = Calendar.getInstance(); 

    startCal.clear(); 
    stopCal.clear(); 

    startCal.setTime(start); 
    stopCal.setTime(stop); 

    startCal.set(Calendar.YEAR, 2011); 
    stopCal.set(Calendar.YEAR, 2011); 
    startCal.set(Calendar.MONTH, 1); 
    stopCal.set(Calendar.MONTH, 1); 
    startCal.set(Calendar.DAY_OF_YEAR, 1); 
    stopCal.set(Calendar.DAY_OF_YEAR, 1); 

    return startCal.before(stopCal); 
} 

這會確保時間的比較是正確的?有沒有更好的選擇(喬達不是一個選項)?我相信這相當於將Calendar對象設置爲當前日期/時間並手動複製小時,分鐘和毫秒組件。你可以假設時區是一樣的。

編輯:澄清我的意思是隻比較Date對象的時間部分。我的意思是,當專門查看時間部分時,開始時間在停止時間之前。日期部分絕對不相關(在該開始=「1月2日20011 10AM」和結束=「2011年1月1日11AM」是非常好的),如果我有一個選擇,我只是使用一些只包含時間,但Date對象是我給的。我不想寫一個if-else的序列,這就是爲什麼我有上面的方法,但我歡迎一個更清潔/更好的方法。

+3

不需要設置年份,月份等等,因爲getInstance()返回設置爲「now」的Calendar對象。但爲了確保它們是相同的,我會改變:stopCal =(Calendar)startCal.clone();否則,我不明白爲什麼這不起作用。 – mirswith

+0

我同意@mirswith,雖然這可能會工作,它突出了java的時間實現是多麼混亂,可以通過使用克隆和setTimes(它複製所有字段)清理。此外,使用清除是危險的,因爲日曆必須在返回before()的答案之前將這些髒字段設置爲某些東西。 – jpredham

+0

有什麼方法可以使用喬達? – chrislovecnm

回答

9

你的代碼應該可以正常工作。你也可以在一個從零開始的一串標記格式只是時間組件,並將它們按字典比較:

public static boolean timeIsBefore(Date d1, Date d2) { 
    DateFormat f = new SimpleDateFormat("HH:mm:ss.SSS"); 
    return f.format(d1).compareTo(f.format(d2)) < 0; 
} 

[編輯]

這是假設的日期具有相同的時區偏移。如果沒有,你必須事先手動調整它們(或作爲此功能的一部分)。

3

一天有86,400,000毫秒,爲什麼不用這個算出來呢? 您可以使用該編號對timeInMilliseconds進行修改並比較結果。

+0

+爲簡單起見。 – Kal

+0

謝謝卡爾,我喜歡解決問題的好方法。 – Ali

+7

**大多數**天有86,400,000毫秒。你不想開始自己轉換日期和時間的道路。 –