Функция к дате возвращения Пасхи в течение данного года

Так, вот забавная небольшая проблема программирования. Я писал быстрый метод для определения всех праздников рынка в течение конкретного года, и затем я начал читать о Пасхе и обнаружил, насколько сумасшедший* логика для определения ее даты - первое воскресенье после Пасхальной Полной луны после пружинного равноденствия! Кто-либо знает о существующей функции для вычисления даты Пасхи на данный год?

Предоставленный, это - вероятно, не все это трудно, чтобы сделать; я просто полагал, что спрошу в случае, если чей-то уже сделанный это. (И это кажется вероятным.)

ОБНОВЛЕНИЕ: На самом деле я действительно ищу дату Великой пятницы (пятница перед Пасхой)... Я просто полагал, что Пасха получит меня там. И так как я нахожусь в США, я предполагаю, что ищу католическую Пасху? Но возможно кто-то может исправить меня на этом, если я неправ.

*"Сумасшедшим" я имел в виду, как, включенный. Ничто наступательное...

25
задан Richard J. Ross III 21 June 2013 в 00:15
поделиться

3 ответа

-

В SQL Server Sheer Saster воскресенье будет выглядеть так, прокрутите вниз для доброй пятницы

CREATE FUNCTION dbo.GetEasterSunday 
( @Y INT ) 
RETURNS SMALLDATETIME 
AS 
BEGIN 
    DECLARE     @EpactCalc INT,  
        @PaschalDaysCalc INT, 
        @NumOfDaysToSunday INT, 
        @EasterMonth INT, 
        @EasterDay INT 

    SET @EpactCalc = (24 + 19 * (@Y % 19)) % 30 
    SET @PaschalDaysCalc = @EpactCalc - (@EpactCalc / 28) 
    SET @NumOfDaysToSunday = @PaschalDaysCalc - ( 
        (@Y + @Y / 4 + @PaschalDaysCalc - 13) % 7 
    ) 

    SET @EasterMonth = 3 + (@NumOfDaysToSunday + 40) / 44 

    SET @EasterDay = @NumOfDaysToSunday + 28 - ( 
        31 * (@EasterMonth / 4) 
    ) 

    RETURN 
    ( 
        SELECT CONVERT 
        (  SMALLDATETIME, 
                 RTRIM(@Y)  
            + RIGHT('0'+RTRIM(@EasterMonth), 2)  
            + RIGHT('0'+RTRIM(@EasterDay), 2)  
        ) 
    ) 

END 
GO

. Хорошо, в пятницу , как это, и он использует функцию пасхи выше

CREATE FUNCTION dbo.GetGoodFriday 
( 
    @Y INT 
) 
RETURNS SMALLDATETIME 
AS 
BEGIN 
    RETURN (SELECT dbo.GetEasterSunday(@Y) - 2) 
END 
GO

отсюда: http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

13
ответ дан 28 November 2019 в 20:51
поделиться

Python: используется функция dateutil easter () .

>>> from dateutil.easter import *
>>> print easter(2010)
2010-04-04
>>> print easter(2011)
2011-04-24

Функция получает в качестве аргумента тип вычисления, который вам нравится:

EASTER_JULIAN   = 1
EASTER_ORTHODOX = 2
EASTER_WESTERN  = 3

Вы можете выбрать тот, который подходит для США.

Сокращение двух дней от результата даст вам Страстную пятницу:

>>> from datetime import timedelta
>>> d = timedelta(days=-2)
>>> easter(2011)
datetime.date(2011, 4, 24)
>>> easter(2011)+d
datetime.date(2011, 4, 22)

Как ни странно, кто-то повторил это и опубликовал результаты в статье Википедии об алгоритме :

alt text

30
ответ дан 28 November 2019 в 20:51
поделиться

Когда мне пришло в голову написать это (предсказание движения по дням недели и праздникам), Я перестал пытаться писать это сам. Я нашел его где-то в сети. Код был общественным достоянием, но...

вздох

смотри сам.

void dateOfEaster(struct tm* p)
{
    int Y = p->tm_year;
    int a = Y % 19;
    int b = Y / 100;
    int c = Y % 100;
    int d = b / 4;
    int e = b % 4;
    int f = (b + 8) / 25;
    int g = (b - f + 1) / 3;
    int h = (19 * a + b - d - g + 15) % 30;
    int i = c / 4;
    int k = c % 4;
    int L = (32 + 2 * e + 2 * i - h - k) % 7;
    int m = (a + 11 * h + 22 * L) / 451;
    p->tm_mon = ((h + L - 7 * m + 114) / 31 ) - 1;
    p->tm_mday = ((h + L - 7 * m + 114) % 31) + 1;
    p->tm_hour = 12;
    const time_t tmp = mktime(p);
    *p = *localtime(&tmp);  //recover yday from mon+mday
}

Некоторые вопросы лучше оставить незаданными.

Мне повезло, что все переездные праздники в моей стране - это фиксированное смещение от даты Пасхи.

4
ответ дан 28 November 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: