Jak obliczyć datę Wielkanocy i Bożego Ciała?

Wielkanoc jest świętem ruchomym. Datę Wielkiej Nocy ustalono na pierwszą niedzielę po pierwszej pełni księżyca po dniu równonocy wiosennej. Ta data może przypadać najwcześniej 22 marca, a najpóźniej 25 kwietnia. Boże Ciało przypada 60 dni po Wielkanocy.
Zastosowany algorytm oblicza datę Wielkanocy dla potrzeb naszego Kościoła i nie jest ścisłym algorytmem astronomicznym.
Algorytm oblicza datę Wielkanocy od daty reformy kalendarza (1582 r.) do roku 2499.

Klasy

Klasa Wielkanoc
package wielkanoc;
class Wielkanoc {
    private int dzienWielk;
    private int miesiacWielk;
    private int rok;
    private int dzienBoze = 0;
    private int miesiacBoze = 0;
    public Wielkanoc(int rok) {
        this.rok = rok;
        int wskA = 0;
        int wskB = 0;
        if (rok <= 1582) {
            wskA = 15;
            wskB = 6;
        } else if ((rok >= 1583) && (rok <= 1699)) {
            wskA = 22;
            wskB = 2;
        } else if ((rok >= 1700) && (rok <= 1799)) {
            wskA = 23;
            wskB = 3;
        } else if ((rok >= 1800) && (rok <= 1899)) {
            wskA = 23;
            wskB = 4;
        } else if ((rok >= 1900) && (rok <= 2099)) {
            wskA = 24;
            wskB = 5;
        } else if ((rok >= 2100) && (rok <= 2199)) {
            wskA = 24;
            wskB = 6;
        } else if ((rok >= 2200) && (rok <= 2299)) {
            wskA = 25;
            wskB = 0;
        } else if ((rok >= 2300) && (rok <= 2399)) {
            wskA = 26;
            wskB = 1;
        } else if ((rok >= 2300) && (rok <= 2499)) {
            wskA = 25;
            wskB = 1;
        }
        int a = rok % 19;
        int b = rok % 4;
        int c = rok % 7;
        int d = (a * 19 + wskA) % 30;
        int e = (2 * b + 4 * c + 6 * d + wskB) % 7;
        int liczbaDni = 22 + d + e;
        if ((d == 29) && (e == 6)) {
            dzienWielk = 19;
            miesiacWielk = 4;
        } else if ((d == 28) & (e == 6)) {
            dzienWielk = 18;
            miesiacWielk = 4;
        } else {
            if (liczbaDni <= 31) {
                dzienWielk = liczbaDni;
                miesiacWielk = 3;
            } else {
                dzienWielk = liczbaDni - 31;
                miesiacWielk = 4;
            }
        }
        obliczBozeCialo();
    }
    private void obliczBozeCialo() {
        int temp;
        if (miesiacWielk == 3) {
            temp = 60 - (31 - dzienWielk) - 30;
        } else {
            temp = 60 - (30 - dzienWielk);
        }
        if (temp <= 31) {
            dzienBoze = temp;
            miesiacBoze = 5;
        } else {
            dzienBoze = temp - 31;
            miesiacBoze = 6;
        }
    }
    public int getRok() {
        return rok;
    }
    public void setRok(int rok) {
        this.rok = rok;
    }
    public int getDzienWielk() {
        return dzienWielk;
    }
    public void setDzienWielk(int dzienWielk) {
        this.dzienWielk = dzienWielk;
    }
    public int getMiesiacWielk() {
        return miesiacWielk;
    }
    public void setMiesiacWielk(int miesiacWielk) {
        this.miesiacWielk = miesiacWielk;
    }
    public int getDzienBoze() {
        return dzienBoze;
    }
    public void setDzienBoze(int dzienBoze) {
        this.dzienBoze = dzienBoze;
    }
    public int getMiesiacBoze() {
        return miesiacBoze;
    }
    public void setMiesiacBoze(int miesiacBoze) {
        this.miesiacBoze = miesiacBoze;
    }
    @Override
    public String toString() {
        return "Data Wielkanocy: " + rok + "-" + miesiacWielk + "-"
                + dzienWielk + "\n" + "Data Bożego Ciała: " + rok + "-"
                + miesiacBoze + "-" + dzienBoze;
    }
}
Klasa Main
package wielkanoc;
public class Main {
    public static void main(String[] args) {
        Wielkanoc w1 = new Wielkanoc(2018);
        System.out.println(w1);
        Wielkanoc w2 = new Wielkanoc(2019);
        System.out.println(w2);
    }
}

Wynik

Data Wielkanocy: 2018-4-1
Data Bożego Ciała: 2018-5-31
Data Wielkanocy: 2019-4-21
Data Bożego Ciała: 2019-6-20

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *