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
相关产品推荐
相关产品推荐

