Java 计算日期之间的天数,不带“;额外的;闰年日期
所以,我必须计算两个日期之间的天数,但不考虑闰年的额外天数 因此,例如,在2012年1月1日和2013年1月1日之间,结果应该是365而不是366 我发现了一个解决方案: 但我不允许使用那个图书馆。。。只有JavaAPI 有了日历,我没有多少运气:Java 计算日期之间的天数,不带“;额外的;闰年日期,java,date,jodatime,Java,Date,Jodatime,所以,我必须计算两个日期之间的天数,但不考虑闰年的额外天数 因此,例如,在2012年1月1日和2013年1月1日之间,结果应该是365而不是366 我发现了一个解决方案: 但我不允许使用那个图书馆。。。只有JavaAPI 有了日历,我没有多少运气: Calendar startCal=new GregorianCalendar(); Calendar endCal=new GregorianCalendar(); startCal.setTime(start); endCal.setTime(e
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,已测试 无JodaTime的解决方案
返回
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日之前,它就不起作用了。为了解决这个问题,我添加了这个ligne
int startDayOfYear=startDate.getMonth().firstDayOfYear(false)
+startDate.getDayOfMonth()-1代码>
为什么要计算已知错误的值?Days.daysBetween(新日期时间(开始)、新日期时间(结束)).getDays()
返回366
这是一个很好的结果:)计算2月29日在您的时间范围内发生的事件,并将其减去。因为我必须:)太长了,无法解释,但它是我正在使用的应用程序的一部分…@diminta解释为什么使用不同于您所考虑的方法通常会产生更好的解决方案。就个人而言,你想做的似乎是错的。我当然错在joda时间上,但我不知道我是如何测试它的,它在一些包含闰年的日期上工作,而不是。。。虽然你的回答比我晚了一点,但我认为你的回答更详细。是的,答案是相同的,但这一个给出了实际的代码。接受这一点是公平的:D@MariuszS你的第一行让我很困惑:你错了JodaTime代码。
(a)我不明白原始海报怎么会错了Joda时间代码。(b) 快速阅读者可能会认为,正如您所说的Joda时间代码是不正确的,而实际上它是正确的。也许你可以巧妙地回答。您好,此解决方案的起始日期为2016年2月26日,结束日期为2016年3月3日。预计为5,实际为6。请提出解决办法。Thanks@MariuszS:是的,实际天数是6天,但当我们讨论从减去天数中跳过闰年时,我们预计输出为5天,但本页上的答案将给出6天,而不是5天(预计)。
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();
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 ;