Java,计算两个date之间的天数

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

在Java中,我想计算两个date之间的天数。

在我的数据库中,它们被存储为DATE数据types,但在我的代码中,它们是string。

我想计算这两个string之间的天数。

那么首先,你只能在必要的时候把它们作为string来处理。 大多数情况下,您应该使用实际描述您正在使用的数据的数据types。

我build议你使用Joda Time ,这是比Date / Calendar更好的API。 这听起来像你应该在这种情况下使用LocalDatetypes。 然后你可以使用:

 int days = Days.daysBetween(date1, date2).getDays(); 

试试这个代码

  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())); 

这个function

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

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

例如:

 ChronoUnit.DAYS.between(startDate,endDate) 

我知道现在这个线程已经两岁了,在这里我还是没有看到正确的答案。

除非你想使用Joda或者使用Java 8,并且如果你需要对受日光节约影响的date进行分解。

所以我写了自己的解决scheme。 重要的是,只有当你真的只关心date,因为有必要丢弃时间信息,所以如果你想要类似于25.06.2014 - 01.01.2010 = 1636 ,这应该工作,不pipeDST:

 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; } 

由于时间总是00:00:00 ,所以使用double和Math.round()应该有助于忽略从冬季到夏季的缺失60000毫秒(1小时)以及从夏季到冬季的额外时间。

这是我用来certificate它的一个小JUnit4testing:

 @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); } } 

…或者如果你想看看它是什么“生活”,用下面的内容replace断言:

 System.out.println("i: " + i + " | " + dayCount + " - getDayCount(" + startDateStr + ", " + dateStr + ")"); 

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

  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) 
 // 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); } 

这里有一个小程序可以帮助你:

 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)); } } 

我真的真的是Java的新手,所以我相信有更好的方法来做我提议的。

我有这个相同的需求,我使用两个date的DAYOFYEAR之间的差异。 这似乎是一个更简单的方法来做到这一点

我不能在性能和稳定性方面真正评估这个解决scheme,但我认为没关系。

这里:

     public static void main(String [] args)throws ParseException {



 / /创build这个代码的一部分只是为了创build我将使用的variables。
 //我在巴西,这里的date格式是DD / MM / YYYY,但不会成为你们的问题。 
 //无论如何,你的格式都可以工作。

     String s1 =“18/09/2014”; 
     String s2 =“01/01/2014”;
     DateFormat f = DateFormat.getDateInstance();
    datedate1 = f.parse(s1); 
    datedate2 = f.parse(s2);




 //这里是我们得到两个date之间的日子的部分。

    日历day1 = Calendar.getInstance();
    日历day2 = Calendar.getInstance(); 
     day1.setTime(DATE1);
     day2.setTime(DATE2);

     int daysBetween = day1.get(Calendar.DAY_OF_YEAR) -  day2.get(Calendar.DAY_OF_YEAR);      




 //一些代码只是为了显示结果...
     f = DateFormat.getDateInstance(DateFormat.MEDIUM);
     System.out.println(“+ f.format(day1.getTime())+”和“+ f.format(day2.getTime())+”之间有+ daysBetween +“天”);



     }

在这种情况下,输出将是(记住我使用date格式DD / MM / YYYY):

从2014年9月18日至2014年1月1日有260天。

这个function对我有好处:

 public static int getDaysCount(Date begin, Date end) { Calendar start = org.apache.commons.lang.time.DateUtils.toCalendar(begin); start.set(Calendar.MILLISECOND, 0); start.set(Calendar.SECOND, 0); start.set(Calendar.MINUTE, 0); start.set(Calendar.HOUR_OF_DAY, 0); Calendar finish = org.apache.commons.lang.time.DateUtils.toCalendar(end); finish.set(Calendar.MILLISECOND, 999); finish.set(Calendar.SECOND, 59); finish.set(Calendar.MINUTE, 59); finish.set(Calendar.HOUR_OF_DAY, 23); long delta = finish.getTimeInMillis() - start.getTimeInMillis(); return (int) Math.ceil(delta / (1000.0 * 60 * 60 * 24)); } 

我的最佳解决scheme(至今)用于计算天数的差异:

 // This assumes that you already have two Date objects: startDate, endDate // Also, that you want to ignore any time portions Calendar startCale=new GregorianCalendar(); Calendar endCal=new GregorianCalendar(); startCal.setTime(startDate); endCal.setTime(endDate); endCal.add(Calendar.YEAR,-startCal.get(Calendar.YEAR)); endCal.add(Calendar.MONTH,-startCal.get(Calendar.Month)); endCal.add(Calendar.DATE,-startCal.get(Calendar.DATE)); int daysDifference=endCal.get(Calendar.DAY_OF_YEAR); 

但是,请注意,这假定不到一年的差异!

如果你厌倦了Java的混乱,你可以把它发送到db2作为你的查询的一部分:

 select date1, date2, days(date1) - days(date2) from table 

将返回date1,date2和两者之间的天数差异。