所以,我必须计算两个日期之间的天数,而不考虑闰年的额外天数......
因此,例如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);
任何不涉及大量代码的想法?
答案 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 ,经过测试。
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 ;