Дата Пасхи

Попалась мне как-то на глаза цитата с баша (из бездны)

«Пасха рассчитывается по формуле Гаусса: a = [(19 * [Y / 19] + 15) / 30], где Y — год, [] — остаток от деления; b = [(2 * [Y / 4] + 4 * [Y / 7] + 6 * a + 6) / 7]; Если (a + b) > 10, то Пасха будет (a + b — 9) апреля ст. стиля, в противном случае — (22 + a + b) марта ст. стиля. Дата Пасхи может попадать в период от 22 марта до 25 апреля по ст. стилю (от 4 апреля до 8 мая по н. стилю).» Гаусс не только великий ученый но и священный математик =)

Я, как известно, человек не очень религиозный, но меня это заинтересовало. Тем более что паска не за горами. Алгоритм уже есть, осталось только его реализовать, а это всего пару строчек кода. Затык был только один — преход с Юлианского календаря на Григорианский. Согласно википедии переход на Григорианский календарь был произведен папой римским Григорием XIII 4 октября 1582. Но не все поддержали эту инициативу и переход длился 346 лет с 1582 по 1928 год. Вот это нихуясебе не могли договориться! Но поскольку Пасхой заведует папа то я решил что моментом перехода будет считаться 1582 год, Пасха в котором была по «старому» стилю.

Чтобы алгоритм с цифрами не смотрелся совсем одиноко я оформил небольшой апплет, который высчитывает Пасху в нашей эре, тоесть время до рождества не доступно, да и собственно не нужно, потому что Пасху тогда не отмечали. Сначала вы посмотрите код, а потом сможете посчитать когда была Пасха например в год вашего рождения.


package ua.kiev.mabp;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Date;
import java.text.SimpleDateFormat;

/**
 * Created by IntelliJ IDEA.
 * User: CTAPbIu_MABP
 * Date: 17.04.2009
 * Time: 10:15:29
 */

public class Easter extends Applet  implements ActionListener {

    private String date;
    private TextField tf;

    public void init() {
        setSize(300,100);
        String year = new SimpleDateFormat("yyyy").format(new Date());
        date = calculate(Integer.parseInt(year));
        tf = new TextField (year, 20);
        add(tf);
        Button btn = new Button("Calculate!");
        btn.addActionListener(this);
        add(btn);
    }

    public void paint(Graphics g) {
        g.drawString(date, 40, 50);
    }

    public void actionPerformed(ActionEvent event) {
        String year = tf.getText().replaceAll("[^\\d]","");
        tf.setText(year);
        date = !year.isEmpty() ? calculate(Integer.parseInt(year)) : "Enter valid year, please!";
        repaint();
    }

    public static String calculate(int year){

        int a = (19 * (year % 19) + 15) % 30;
        int b = ( 2 * (year % 4) + 4 * (year % 7) + 6 * a + 6) % 7;

        int oldDate = (a + b) > 9 ? (a + b - 9) : (22 + a + b);
        String oldMonth = (a + b) > 9 ? " april" : " march";

        int newDate;
        String newMonth;
        if((a + b) > 9){ // апрель
            newDate = oldDate + 13 > 30 ? oldDate + 13 - 30 : oldDate + 13;
            newMonth = oldDate + 13 > 30 ? " may" : " april";
        }else{ // март
            newDate = oldDate + 13 > 31 ? oldDate + 13 - 31 : oldDate + 13;
            newMonth = oldDate + 13 > 31 ? " april" : " march";
        }
        return year > 1582 ? newDate + newMonth : oldDate + oldMonth;
    }
}

Итак смотрите что у меня получилось в результате:

2 Комментарии “Дата Пасхи

  1. на многие года ошибка
    например на 2010 пасха 4 апреля, а калькулятор показывает 5 мая

  2. Да, немного накосячил с переходом от старого стиля к новому. Уже поправил. Спасибо.

Комментарии закрыты