在Java中获取日期之间的天数差异

38

可能重复:
如何使用Java计算两个日期之间的差异

我正在尝试类似这样的操作,从组合框中获取日期。

Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();  

int Sdate=Integer.parseInt(cmbSdate.getSelectedItem().toString());  
int Smonth=cmbSmonth.getSelectedIndex();
int Syear=Integer.parseInt(cmbSyear.getSelectedItem().toString());  

int Edate=Integer.parseInt(cmbEdate.getSelectedItem().toString());
int Emonth=cmbEmonth.getSelectedIndex();
int Eyear=Integer.parseInt(cmbEyear.getSelectedItem().toString());

start.set(Syear,Smonth,Sdate);  
end.set(Eyear,Emonth,Edate);

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String startdate=dateFormat.format(start.getTime());  
String enddate=dateFormat.format(end.getTime());

我无法将结束日期减去开始日期。如何获取开始日期和结束日期之间的差异?


你为什么做不到?异常?日期错误? - Bozho
我正在尝试在NetBeans中编写这个程序,我尝试着用end.getTime()-start.getTime()来进行减法运算,但是我收到了通知,说可以在两个日期对象之间使用-运算符。 - Charanraj Golla
为什么我不能添加我的答案?我没有这样的问题,我有另一个解决方案。 - Radio Rogal
可能是因为该问题被标记为重复。 - Charanraj Golla
现代注释:我建议您不要使用CalendarSimpleDateFormat。这些类设计不佳且过时,后者尤其麻烦。相反,请使用LocalDateChronoUnit.DAYS,它们都来自于Java时间和日期API的现代版本 - Ole V.V.
3个回答

48
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
start.set(2010, 7, 23);
end.set(2010, 8, 26);
Date startDate = start.getTime();
Date endDate = end.getTime();
long startTime = startDate.getTime();
long endTime = endDate.getTime();
long diffTime = endTime - startTime;
long diffDays = diffTime / (1000 * 60 * 60 * 24);
DateFormat dateFormat = DateFormat.getDateInstance();
System.out.println("The difference between "+
  dateFormat.format(startDate)+" and "+
  dateFormat.format(endDate)+" is "+
  diffDays+" days.");

正如orange80所指出的那样,当跨越夏令时(或闰秒)时,这种方法将无法正常工作,并且在使用不同的时间时也可能无法产生预期的结果。为了获得正确的结果,使用JodaTime可能更容易,因为在Java 8之前,我知道唯一正确的方法是使用Calendar的add和before/after方法来检查和调整计算:

start.add(Calendar.DAY_OF_MONTH, (int)diffDays);
while (start.before(end)) {
    start.add(Calendar.DAY_OF_MONTH, 1);
    diffDays++;
}
while (start.after(end)) {
    start.add(Calendar.DAY_OF_MONTH, -1);
    diffDays--;
}

2
你能否请解释一下这段代码:1000 * 60 * 60 *24。 - Charanraj Golla
1
Date.getTime返回自1970年以来的毫秒数,因此差异也是以毫秒为单位。1000毫秒等于1秒,60秒等于1分钟,60分钟等于1小时,24小时等于1天。当然,您可以只将diffTime除以86400000,但那样您就看不太清楚(好吧,显然还不够清楚;))那个数字是什么了。 - hd42
10
跨越夏令时边界的日期范围将会不正确。 - jpswain
3
我曾经遇到相同的问题,但是我发现那些冗长的代码非常低效。尽管这是一个重复的、老旧的问题,但我找到了一个简单的解决方法,可以试试这个代码:public static long getTimeDiff(Date dateOne, Date dateTwo) { long diff = 0; long timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime()); diff = TimeUnit.MILLISECONDS.toDays(timeDiff); return diff; } - Ruwanka De Silva
2
@abhilash 以start.set(2014, Calendar.MARCH, 8)和end.set(2014, Calendar.APRIL, 8)为例;当我在德国运行此代码(跨越3月30日夏令时,美国则是3月9日),如果没有orange80评论中提到的修复程序,我得到的差异是30天,而使用修复程序后得到正确的31天。如果您在设置了印度语言环境的计算机上运行此代码,则可能没有任何差异,因为印度似乎没有夏令时(根据http://www.timeanddate.com/time/dst/2014.html)。 - hd42
显示剩余4条评论

25

使用JodaTime来实现。它比标准的Java DateTime Api更好。下面是使用JodaTime计算天数差异的代码:

private static void dateDiff() {

    System.out.println("Calculate difference between two dates");
    System.out.println("=================================================================");

    DateTime startDate = new DateTime(2000, 1, 19, 0, 0, 0, 0);
    DateTime endDate = new DateTime();

    Days d = Days.daysBetween(startDate, endDate);
    int days = d.getDays();

    System.out.println("  Difference between " + endDate);
    System.out.println("  and " + startDate + " is " + days + " days.");

  }

2
谢谢您的回答,Faisal先生。但我需要仅使用内置函数和API。 - Charanraj Golla
2
现在Java 8基本上有与Joda Time相同的结构,您可以使用java.time.LocalDateTime和ChronoUnit.DAYS.between(startDate,endDate)实现此操作。 - Ben L.

18

这样

import java.util.Date;
import java.util.GregorianCalendar;

/**
 * DateDiff -- compute the difference between two dates.
 */
public class DateDiff {
  public static void main(String[] av) {
    /** The date at the end of the last century */
    Date d1 = new GregorianCalendar(2000, 11, 31, 23, 59).getTime();

    /** Today's date */
    Date today = new Date();

    // Get msec from each, and subtract.
    long diff = today.getTime() - d1.getTime();

    System.out.println("The 21st century (up to " + today + ") is "
        + (diff / (1000 * 60 * 60 * 24)) + " days old.");
  }

}

这里有一篇关于Java日期运算的文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接