Java复活节周日计算程序:最早/最晚日期筛选功能异常
问题排查与修复
你的代码核心问题是最早/最晚日期的筛选逻辑完全颠倒,同时初始化值不符合需求,导致结果完全错误。
具体问题点
初始化值错误
- 要找时间段内最晚的复活节,初始值应该设为
LocalDate.MIN(最小日期),这样后续才能找到比它晚的日期;你现在设成了LocalDate.MAX,所有日期都比它早,永远不会更新。 - 要找时间段内最早的复活节,初始值应该设为
LocalDate.MAX(最大日期),这样后续才能找到比它早的日期;你现在设成了LocalDate.MIN,所有日期都比它晚,永远不会更新。
- 要找时间段内最晚的复活节,初始值应该设为
判断逻辑颠倒
- 更新最晚日期时,应该判断当前复活节是否晚于当前记录的最晚日期(
isAfter),你用了isBefore,导致把更早的日期当成了最晚的。 - 更新最早日期时,应该判断当前复活节是否早于当前记录的最早日期(
isBefore),你用了isAfter,导致把更晚的日期当成了最早的。
- 更新最晚日期时,应该判断当前复活节是否晚于当前记录的最晚日期(
修正后的核心代码
// 修正初始化值 LocalDate spätesterOstersonntag = LocalDate.MIN; LocalDate frühesterOstersonntag = LocalDate.MAX; int currentYear = 2023; for (int i = 0; i < x; i++) { LocalDate ostersonntag = berechneOstersonntag(currentYear + i); // 修正最晚日期判断逻辑 if (ostersonntag.isAfter(spätesterOstersonntag)) { spätesterOstersonntag = ostersonntag; } // 修正最早日期判断逻辑 if (ostersonntag.isBefore(frühesterOstersonntag)) { frühesterOstersonntag = ostersonntag; } }
额外优化(可选)
如果需要输出指定格式(如2023.04.22),可以用DateTimeFormatter格式化输出:
import java.time.format.DateTimeFormatter; // ... DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd"); System.out.println("Spaetester Ostersonntag: " + spätesterOstersonntag.format(formatter)); System.out.println("Fruehester Ostersonntag: " + frühesterOstersonntag.format(formatter));
验证示例
输入20时,修正后会得到正确的最早/最晚复活节日期,比如2038年的3月20日(最早)和2035年的4月21日(最晚)。
内容的提问来源于stack exchange,提问作者FlobiusKane
相关产品推荐
相关产品推荐

