计算复活节的最早和最晚日期

问题描述 投票:0回答:1

“我被分配了用 Java(C# 也可以)编写计算器的任务,该计算器根据当前年份和用户输入,输出最早和最晚复活节星期日的日期。该程序应该以这种方式工作用户输入一个代表未来要检查的年数的数字。当前年份是 2023 年。然后输出应显示复活节星期日在指定年数内发生的最早和最晚日期。

不幸的是,我的代码似乎没有解决它。复活节星期天的计算是正确的,但由于某些原因,筛选最早和最晚的复活节星期天似乎不起作用。”

        import java.time.LocalDate;
        import java.util.Scanner;

        public class Ostersonntag3 {
        public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Bitte geben Sie eine Anzahl an Jahren ein: ");
        int x = scanner.nextInt();

        LocalDate spätesterOstersonntag = LocalDate.MAX;
        LocalDate frühesterOstersonntag = LocalDate.MIN;

        int currentYear = 2023;

        for (int i = 0; i < x; i++) {
            LocalDate ostersonntag = berechneOstersonntag(currentYear + 
        i);

            if (ostersonntag.isBefore(spätesterOstersonntag)) {
                spätesterOstersonntag = ostersonntag;
            }

            if (ostersonntag.isAfter(frühesterOstersonntag)) {
                frühesterOstersonntag = ostersonntag;
            }
        }

        System.out.println("Spaetester Ostersonntag: " + 
        spätesterOstersonntag);
        System.out.println("Fruehester Ostersonntag: " + 
        frühesterOstersonntag);

        scanner.close();
        }
 
        private static LocalDate berechneOstersonntag(int jahr) {
        int a = jahr % 19;
        int b = jahr % 4;
        int c = jahr % 7;
        int m = (8 * (jahr / 100) + 13) / 25 - 2;
        int s = jahr / 100 - jahr / 400 - 2;
        int n = (6 + s) % 7;
        int d = (m + 19 * a) % 30;

        if (d == 29) {
            d = 28;
        }

        if (d == 28 && a >= 11) {
            d = 27;
        }

        int e = (2 * b + 4 * c + 6 * d + n) % 7;

        int tag = 21 + d + e + 1;
        int monat;

        if (tag > 31) {
            tag = tag % 31;
            monat = 4;
        } else {
            monat = 3;
        }

        return LocalDate.of(jahr, monat, tag);
        }
        }

如您所见,输入是一个数字(整数),我想要的输出是一个日期(例如 2023.04.22 等)日期应代表用户输入的年数中最早和最晚的复活节星期日在。 但输出似乎没有给我正确的日期: [(例如输入为 20;输出为 2023.04.16 作为最近的复活节星期日,2023.04.20 是最近的复活节星期日的日期) (但如果输入为200,则输出最晚为2023.04.16,最早为2023.04.14) (如果输入为 30,输出最晚为 2023.04.16,最早为 2023.03.31)]。 这对我来说根本没有意义??

java eclipse
1个回答
0
投票

问题是你在递增年份。并且使用

isBefore
isAfter
方法还包括错误报告复活节
min
max
日期的年份。例子。
2023-04-09 isBefore 2024-03-31
从日期的角度而不是从
month/day
的角度。注意:我必须打印您正在比较的实际值以查看发生了什么,起初对我来说并不明显。 打印语句是调试时的好帮手。因此,您只需将复活节一年中的这一天与一年中的前几天进行比较即可。所以这就是我所做的。

  • 定义一个比较器来比较月份和日期。
  • 将您的
    min
    max
    初始化为复活节的当年日期。
  • 然后从“1”开始,增加你的年龄。
int x = 20;

int currentYear = 2023;
Comparator<LocalDate> comp = Comparator.comparing(LocalDate::getDayOfYear);

LocalDate ostersonntag = berechneOstersonntag(currentYear);
LocalDate spätesterOstersonntag = ostersonntag;
LocalDate frühesterOstersonntag = ostersonntag;

    for (int i = 0; i < x; i++) {
       ostersonntag = berechneOstersonntag(currentYear + 
    i);

        if (comp.compare(ostersonntag, spätesterOstersonntag) > 0) {
            spätesterOstersonntag = ostersonntag;
        } else if (comp.compare(ostersonntag, frühesterOstersonntag) < 0) {
            frühesterOstersonntag = ostersonntag;
        }
    }

    System.out.println("Spaetester Ostersonntag: " + 
    spätesterOstersonntag);
    System.out.println("Fruehester Ostersonntag: " + 
    frühesterOstersonntag);     
}

版画

Spaetester Ostersonntag: 2038-04-25
Fruehester Ostersonntag: 2035-03-25
© www.soinside.com 2019 - 2024. All rights reserved.