Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算日期之间的天数,不带“;额外的;闰年日期_Java_Date_Jodatime - Fatal编程技术网

Java 计算日期之间的天数,不带“;额外的;闰年日期

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

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

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

我发现了一个解决方案:

但我不允许使用那个图书馆。。。只有JavaAPI

有了日历,我没有多少运气:

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 ;