计算闰年中没有“额外”日期的日期之间的天数

时间:2014-01-16 13:06:44

标签: java date jodatime

所以,我必须计算两个日期之间的天数,而不考虑闰年的额外天数......

因此,例如2012年1月1日到2013年1月1日之间应该是365而不是366。

我遇到了Joda-Time的解决方案:

int days = Days.daysBetween(new DateTime(start), new DateTime(end)).getDays();

但我不允许使用该库...只有Java API。

使用日历我没有多少运气:

Calendar startCal=new GregorianCalendar();
Calendar endCal=new GregorianCalendar();
startCal.setTime(start);
endCal.setTime(end);
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);

任何不涉及大量代码的想法?

4 个答案:

答案 0 :(得分:3)

只要看看年份和日期。

 int days = (end.year-start.year)*365 + end.dayOfYear - start.dayOfYear;

答案 1 :(得分:1)

你对这句话说错了:

  

因此,例如2012年1月1日到2013年1月1日之间应该是365而不是366。

JodaTime在这种情况下返回 366 ,经过测试。

没有JodaTime的解决方案

GregorianCalendar start = new GregorianCalendar(2012, 0, 1);
GregorianCalendar end = new GregorianCalendar(2013, 0, 1);
int days = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 365 +
        (end.get(Calendar.DAY_OF_YEAR) - start.get(Calendar.DAY_OF_YEAR));
System.out.println(days);

返回365

答案 2 :(得分:1)

当结束日期是闰年和2月29日之后,其他答案不起作用。 在制定一年中的结束日期时,您需要排除2月29日。

使用Java 8的java.time包,您可以在计算每月第一天的年份时传入isLeapYear布尔值:

LocalDate.now().getMonth().firstDayOfYear(false)

然后可以将其组合到calc的其余部分中:

LocalDate startDate = LocalDate.of(2011, 7, 1);
LocalDate endDate = LocalDate.of(2012, 4, 9);

int endDayOfYear = endDate.getMonth().firstDayOfYear(false) 
                         + endDate.getDayOfMonth() - 1;

int daysNoLeaps = ((endDate.getYear() - startDate.getYear()) * 365) 
                         + endDayOfYear - startDate.getDayOfYear();

答案 3 :(得分:0)

感谢Andy!您的答案是正确的,但当开始日期为leap年且在2月29日之前无效。解决此问题,我添加了此ligne

  

int startDayOfYear = startDate.getMonth().firstDayOfYear(false) + startDate.getDayOfMonth() - 1;

  LocalDate startDate = LocalDate.of(2011, 7, 1);
  LocalDate endDate = LocalDate.of(2012, 4, 9);

  int endDayOfYear = endDate.getMonth().firstDayOfYear(false) 
                     + endDate.getDayOfMonth() - 1;

  int startDayOfYear = startDate.getMonth().firstDayOfYear(false) 
                     + startDate.getDayOfMonth() - 1;`

  int daysNoLeaps = ((endDate.getYear() - startDate.getYear()) * 365) 
                     + endDayOfYear - startDayOfYear ;