Java 两个日期之间的日差

Java 两个日期之间的日差,java,Java,2020年2月15日至2020年3月2日之间的产量为18,但我预计为16 我做错了什么 public void checkNumberOfDaysBetweenTwoDates(models.Date date2) { int day_diff, mon_diff, year_diff; if(date2.checkIfLegal()) { if(date2.day < day) { date2.day += date2.numbe

2020年2月15日至2020年3月2日之间的产量为18,但我预计为16

我做错了什么

public void checkNumberOfDaysBetweenTwoDates(models.Date date2) {
    int day_diff, mon_diff, year_diff;

    if(date2.checkIfLegal()) {
        if(date2.day < day) {
            date2.day += date2.numberOfDaysInMonth();
        }
        date2.month = date2.month - 1;
    }

    if(date2.month < month) {
        date2.month += 12;
        date2.year -= 1;
    }

    day_diff = date2.day - day;
    mon_diff = date2.month - month;
    year_diff = date2.year - year;

    System.out.println("days: " + day_diff + "months: " + mon_diff + "years: " + year_diff);
}

private boolean isLeapYear() {
    return year % 4 == 0 &&
        (year % 100 != 0 || year % 400 == 0);
}

public boolean checkIfLegal() {
    boolean validation = false;

    if(month < 1 || month > 12 || day < 1 || day > numberOfDaysInMonth()) {
        validation = false;
    } else {
        validation = true;
    }

    return validation;
}

private int numberOfDaysInMonth() {
    if (month == 2 && isLeapYear())
        return 29;
    else
        return daysInMonth[month - 1];
}
public void checknumberofdays两个日期之间(models.Date-date2){
国际日、月、年;
如果(日期2.checkIfLegal()){
如果(日期2.day<天){
date2.day+=date2.numberOfDaysInMonth();
}
date2.month=date2.month-1;
}
如果(日期2.2月<月){
日期2.2月+=12日;
日期2.1年-=1;
}
day_diff=date2.day-天;
mon_diff=date2.month-month;
year_diff=date2.year—year;
系统输出打印项次(“日:+日差+”月:+月差+”年:+年差);
}
私有布尔值isLeapYear(){
返回年份%4==0&&
(年份%100!=0 | |年份%400==0);
}
公共布尔checkIfLegal(){
布尔验证=假;
如果(月<1 | |月>12 | | |日<1 | |日>numberOfDaysInMonth()){
验证=假;
}否则{
验证=真;
}
退货确认;
}
private int numberOfDaysInMonth(){
如果(月==2&&isLeapYear())
返回29;
其他的
返回日期每月[第1个月];
}

如果第二个日期的天数小于第一个日期的天数,则添加一个月的天数:

date2.day += date2.numberOfDaysInMonth();

添加
date2
月份的天数(此处为31,3月份的天数)。但是您必须添加上个月的天数(这里是29,2月份的天数)

另一件需要考虑的事情:方法
checkIfLegal
可以简化为

public boolean checkIfLegal() {
    return month >= 1 && month <= 12 && day >= 1 && day <= numberOfDaysInMonth();
}
public boolean checkIfLegal(){

return month>=1&&month=1&&day您检查了吗?@ArvindKumarAvinash这些解决方案包括不同的java方法,如getTime(),日历和其他东西。我想要两个日期之间计算的数学过程。@TiKi,首先,更改输入参数是不对的。你不应该在计算中更改
date2
对象。至于有什么问题,请调试它:当
date2.day
时,你添加到
date2.day
三月份的天数,而h是31,它比今年2月的天数正好多2天,并且与您的错误率有很好的相关性。使用java.time API是最舒服的,它在类中提供了现成的实现,如
ZonedDateTime
@pxcv7r,在这种特殊情况下,它是
LocalDate
Period
,bu这不是问题的重点:OP想编写自己的实现。