计算闰年中没有"extra"日期的日期之间的天数



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

因此,例如,在 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);

有什么想法不涉及很多代码吗?

看看年份和年份。

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

你对这个说法是错误的:

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

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

没有乔达时间的解决方案

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 月 29 日之后时,其他答案不起作用。在计算一年中的结束日期时,您需要排除 2 月 29 日。

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

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

然后,这可以合并到计算的其余部分:

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

谢谢安迪!!您的答案是正确的,但是当开始日期在闰年和2月29日之前时,它不起作用。解决这个问题,我添加了这个法谱

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 ; 

最新更新