2013-07-08 101 views
1

我試圖計算兩個日期對象之間在幾分鐘內的持續時間。從兩個Date對象計算錯誤時間以計算持續時間

我在我的研究中發現了一些靈感,來自this stackoverflow問題。一般來說,這似乎是正確的,但我正在遇到一個有趣的行爲,一個測試用例。

當我運行下面附加的源代碼(您可以簡單地複製過去它),它返回我66分鐘,而不是(正確的結果)6,我目前不明白爲什麼。也許我現在正在監督一些事情,你能告訴我它是什麼嗎?

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 

public class Test { 

    private SimpleDateFormat parserSDF = new SimpleDateFormat("MM/dd/yy HH:mm", 
      Locale.ENGLISH); 

    public static void main(String[] args) { 
     Test test = new Test(); 
     Date begin = test.createDateFromString("10/25/09 1:54"); 
     Date end = test.createDateFromString("10/25/09 2:00"); 

     int duration = test.minutesDiff(begin, end); 
     //result is 66 
     System.out.println(duration); 
    } 

    public int minutesDiff(Date earlierDate, Date laterDate) { 
     if (earlierDate == null || laterDate == null) 
      return 0; 

     return (int) ((laterDate.getTime()/60000) - (earlierDate.getTime()/60000)); 
    } 

    public Date createDateFromString(String dateString) { 
     Date date = null; 
     try { 
      date = parserSDF.parse(dateString); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     return date; 
    } 
} 

我順便說一句知道存在這個喬達庫,它確實在計算這個東西更好的方式,但如果可能的話,我想留在沒有外部庫。

感謝您與我分享的每一個想法。

編輯:啊,這可能是因爲時鐘改變?時鐘改變是在2009年10月25日,時間從早上3點恢復到凌晨2點。這可能意味着,這個結果是正確的

+0

我在這裏編譯並運行它:http://www.compileonline.com/compile_java_online.php它的工作 – giorashc

+0

如果我運行該代碼,我得到6 –

回答

5

根據您的區域設置,它看起來像是夏令時a.k.a夏令時的結束。 Here's the 2009 table; 2009年10月25日是許多地區的結束日期。這將解釋爲什麼66出現而不是6;還有60多分鐘。

+0

是的,我也剛剛發現了這一點:)我認爲這是這個原因 – Waylander

+0

這是我第一次調查60分鐘的錯誤。 –

+0

愚蠢的我,我沒有想到這個更早 – Waylander

0
laterDate.getTime() 

回報在毫秒long值。您正在將long值賦予int。這會導致錯誤的時間差。

+3

他在計算結束時轉換爲int而不是每個的getTime()。最後的結果應該是6,而不管在最後轉換爲int – giorashc

+0

@giorashc我說可能會導致錯誤的時間差。不是在每一次 –

+3

我嚴重懷疑答案:)。 – giorashc