计算java时出错日期差异

问题描述:

计算两个日期(java.util.Date)之间的差异,的日子看起来很简单,我们可以找到不同的方式来做到这一点。我用下面的代码来计算日期差:计算java时出错日期差异

public static long daysBetween(Calendar startDate, Calendar endDate) { 
     Calendar date = (Calendar) startDate.clone(); 
     long daysBetween = 0; 
     while (date.before(endDate)) { 
      date.add(Calendar.DAY_OF_MONTH, 1); 
      daysBetween++; 
     } 
     return daysBetween; 
    } 

main(),我用下面的两个日期:

Calendar c1 = Calendar.getInstance(); 
    c1.set(2011, 1, 1); 
    Calendar c2 = Calendar.getInstance(); 
    c2.set(2011, 1, 31); 

    long difference = daysBetween(c1, c2); // 

但变量difference的价值是不相符的。有时候是30,有时候是31.所以,为什么会发生这种情况。

是否有任何解决方案使用该方法结果一致的输出?

+0

我跑了几次,我只得到30而不是31。 – sakthi 2012-08-06 13:13:33

你设置日历的日期部分,但不是时间一部分。

有时候时钟会在getInstance()的调用之间打勾,有时它不会,因此不一致。

选项:

  • 设置时间以及日期,例如到午夜
  • 使用更好的日期/时间库 - Joda Time - 它有一个更合适的表示形式(LocalDate)。这里一个重要的道德是,如果你能找到一种代表你所拥有的确切信息的类型,而不是别的,那么这可能是一个很好的选择,并且会导致更少的并发症。

使用LocalDate,您甚至不需要执行循环,因为Joda Time对计算两个值之间的差异有很好的支持。

LocalDate date1 = new LocalDate(2011, 1, 1); 
LocalDate date2 = new LocalDate(2011, 1, 31); 
Days period = Days.daysBetween(days1, days2); 
int days = period.getDays(); 

您只设置年,月和日。小时,分钟,秒和毫秒的当前时间(因而不同的每次运行它时)

我建议你使用乔达时间的,而不是LOCALDATE,因为它似乎你想要做什么。