所以,我必须计算两个日期之间的天数 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 ;