2013-07-08 105 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