Java,计算两个日期之间的天数

sag*_*arg 64 java string date

可能重复:
计算两个Java日期实例之间的差异

在Java中,我想计算两个日期之间的天数.

在我的数据库中,它们存储为DATE数据类型,但在我的代码中它们是字符串.

我想计算这两个字符串之间的天数.

Jon*_*eet 130

好吧,首先,你应该在必要时将它们作为字符串处理.大多数情况下,您应该使用实际描述您正在使用的数据的数据类型.

我建议您使用Joda Time,这是一个比Date/ 更好的API Calendar.听起来你应该LocalDate在这种情况下使用这种类型.然后你可以使用:

int days = Days.daysBetween(date1, date2).getDays();
Run Code Online (Sandbox Code Playgroud)

  • 似乎这种方法是排他性的而不是包含性的,因此可能需要在结果中添加 1(或将 **25**(而不是 24)小时添加到 `date2` 中)以使其包含性。 (2认同)

小智 45

在Java 8.您可以使用实例Enum ChronoUnit来计算不同单位(天,月,秒)的时间量.

例如:

ChronoUnit.DAYS.between(startDate,endDate)
Run Code Online (Sandbox Code Playgroud)

  • `Now now = date1.toInstant();` (3认同)
  • 说我需要使用Temporal not Date任何想法吗? (2认同)
  • 最近我发现这个方法有一个问题:`startDate`和`endDate`之间存在从冬天到夏天的时间变化。由于两者的时间都是“00:00:00”,“endDate”到“Instant”的转换会产生一小时前的结果,因此之间的天数比实际结果少一天。 (2认同)

Pra*_*tik 41

试试这段代码

     Calendar cal1 = new GregorianCalendar();
     Calendar cal2 = new GregorianCalendar();

     SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");

     Date date = sdf.parse("your first date");
     cal1.setTime(date)
     date = sdf.parse("your second date");
     cal2.setTime(date);

    //cal1.set(2008, 8, 1); 
     //cal2.set(2008, 9, 31);
     System.out.println("Days= "+daysBetween(cal1.getTime(),cal2.getTime()));
Run Code Online (Sandbox Code Playgroud)

这个功能

     public int daysBetween(Date d1, Date d2){
             return (int)( (d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
     }
Run Code Online (Sandbox Code Playgroud)

  • @stanicmail但是2016年1月1日到1月2日之间只有一天!当然,除非你在d0 = 2015年12月31日喝得太多.;-) (8认同)
  • 这种方法将如何处理夏令时变化? (2认同)
  • 这个公式不错,但是会少1天。例如,d1 = 2016 年 1 月 2 日,d2 = 2016 年 1 月 1 日,它会给您 1 天而不是 2 天。 (2认同)

tom*_*row 25

我知道这个帖子现在已经两年了,我仍然没有在这里看到正确的答案.

除非你想使用Joda或拥有Java 8,并且你需要减去受夏令时影响的日期.

所以我写了自己的解决方案.重要的一点是它只有在你真正关心日期时才有效,因为有必要丢弃时间信息,所以如果你想要类似的东西25.06.2014 - 01.01.2010 = 1636,无论DST如何,这都应该有效:

private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy");

public static long getDayCount(String start, String end) {
  long diff = -1;
  try {
    Date dateStart = simpleDateFormat.parse(start);
    Date dateEnd = simpleDateFormat.parse(end);

    //time is always 00:00:00, so rounding should help to ignore the missing hour when going from winter to summer time, as well as the extra hour in the other direction
    diff = Math.round((dateEnd.getTime() - dateStart.getTime()) / (double) 86400000);
  } catch (Exception e) {
    //handle the exception according to your own situation
  }
  return diff;
}
Run Code Online (Sandbox Code Playgroud)

随着时间的推移00:00:00,使用双倍然后Math.round()应该有助于忽略从冬季到夏季时缺少的60000毫秒(1小时)以及从夏季到冬季的额外时间.

这是我用来证明它的小型JUnit4测试:

@Test
public void testGetDayCount() {
  String startDateStr = "01.01.2010";
  GregorianCalendar gc = new GregorianCalendar(locale);
  try {
    gc.setTime(simpleDateFormat.parse(startDateStr));
  } catch (Exception e) {
  }

  for (long i = 0; i < 10000; i++) {
    String dateStr = simpleDateFormat.format(gc.getTime());
    long dayCount = getDayCount(startDateStr, dateStr);
    assertEquals("dayCount must be equal to the loop index i: ", i, dayCount);
    gc.add(GregorianCalendar.DAY_OF_YEAR, 1);
  }
}
Run Code Online (Sandbox Code Playgroud)

......或者如果你想看看它的'生命',用以下方法替换断言:

System.out.println("i: " + i + " | " + dayCount + " - getDayCount(" + startDateStr + ", " + dateStr + ")");
Run Code Online (Sandbox Code Playgroud)

...这就是输出应该是这样的:

  i: 0 | 0  - getDayCount(01.01.2010, 01.01.2010)
  i: 1 | 1  - getDayCount(01.01.2010, 02.01.2010)
  i: 2 | 2  - getDayCount(01.01.2010, 03.01.2010)
  i: 3 | 3  - getDayCount(01.01.2010, 04.01.2010)
  ...
  i: 1636 | 1636  - getDayCount(01.01.2010, 25.06.2014)
  ...
  i: 9997 | 9997  - getDayCount(01.01.2010, 16.05.2037)
  i: 9998 | 9998  - getDayCount(01.01.2010, 17.05.2037)
  i: 9999 | 9999  - getDayCount(01.01.2010, 18.05.2037)
Run Code Online (Sandbox Code Playgroud)


Alp*_*ale 11

这是一个小程序,可以帮助你:

import java.util.*;

public class DateDifference {
    public static void main(String args[]){
        DateDifference difference = new DateDifference();
    }

    DateDifference() {
        Calendar cal1 = new GregorianCalendar();
        Calendar cal2 = new GregorianCalendar();

        cal1.set(2010, 12, 1); 
        cal2.set(2011, 9, 31);
        System.out.println("Days= "+daysBetween(cal1.getTime(),cal2.getTime()));
    }

    public int daysBetween(Date d1, Date d2) {
        return (int)( (d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

// http://en.wikipedia.org/wiki/Julian_day
public static int julianDay(int year, int month, int day) {
  int a = (14 - month) / 12;
  int y = year + 4800 - a;
  int m = month + 12 * a - 3;
  int jdn = day + (153 * m + 2)/5 + 365*y + y/4 - y/100 + y/400 - 32045;
  return jdn;
}

public static int diff(int y1, int m1, int d1, int y2, int m2, int d2) {
  return julianDay(y1, m1, d1) - julianDay(y2, m2, d2);
}
Run Code Online (Sandbox Code Playgroud)