You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java日期差计算实现存在非闰年场景误差问题求助

日期差计算偏差问题的解决思路

嘿,我找到你这个日期差计算偏差的问题根源啦!

问题核心原因

你的get_Difference函数里,计算总天数的逻辑有个关键漏洞:你直接用y1 * 365和y2 * 365来计算年份对应的天数,但完全忽略了从公元元年到目标年份之前存在的闰年。哪怕你还没处理当前年份的闰年逻辑,过去的每一个闰年都会比平年多1天,这些额外的天数没有被计入总天数,最终导致差值少算了两个年份之间的闰年数量——比如你的测试用例里,1999到2019之间刚好有5个闰年(2000、2004、2008、2012、2016),这正好对应你看到的5天偏差!

快速修正(不添加当前年份闰年处理)

我们先添加一个辅助函数,计算从公元1年到目标年份之前的总闰年数,然后把这些额外天数加到总天数里:

import java.util.Scanner;
public class Date_Difference {
    public static void main(String[] args) {
        Scanner myObj = new Scanner(System.in);
        int d1 = myObj.nextInt();
        int m1 = myObj.nextInt();
        int y1 = myObj.nextInt();
        int d2 = myObj.nextInt();
        int m2 = myObj.nextInt();
        int y2 = myObj.nextInt();
        System.out.println(get_Difference(d1,m1,y1,d2,m2,y2));
    }
    
    static int get_Difference(int d1, int m1, int y1, int d2, int m2, int y2 ) {
        // 加入闰年数计算
        int n1 = y1 * 365 + d1 + countLeapYears(y1);
        int i;
        for (i = 0; i < m1 - 1; i++) {
            n1 += monthDays_notleapyear[i];
        }
        
        int n2 = y2 * 365 + d2 + countLeapYears(y2);
        for (i = 0; i < m2 - 1; i++) {
            n2 += monthDays_notleapyear[i];
        }
        return Math.abs(n2 - n1);
    }
    
    // 计算从公元1年到year-1年的总闰年数
    static int countLeapYears(int year) {
        int count = year / 4;
        // 减去整百年但不是400倍数的年份
        count -= year / 100;
        // 加回400倍数的整百年份
        count += year / 400;
        return count;
    }
    
    static int monthDays_notleapyear[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
}

用这个修改后的代码运行你的测试用例,就能得到正确的6980 days结果了。

进阶完善:补充当前年份的闰年处理

如果之后要完整支持闰年场景(比如2月29日的日期计算),还需要判断当前年份是否为闰年,且月份大于2月时额外加1天。可以添加以下函数并修改计算逻辑:

// 判断某一年是否为闰年
static boolean isLeapYear(int year) {
    if (year % 400 == 0) {
        return true;
    }
    if (year % 100 == 0) {
        return false;
    }
    return year % 4 == 0;
}

然后在get_Difference函数里计算n1和n2的时候,加上:

// 处理当前年份是闰年且月份超过2月的情况
if (m1 > 2 && isLeapYear(y1)) {
    n1 += 1;
}
// 同理处理n2
if (m2 > 2 && isLeapYear(y2)) {
    n2 += 1;
}

这样就能覆盖所有闰年场景的日期差计算了。

内容的提问来源于stack exchange,提问作者Jack Puthichak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:17