31

というわけで、ちょっと面白いプログラミングのチャレ​​ンジです。私は特定の年のすべての市場の休日を決定するための簡単な方法を書いていました。それからイースターについて読み始めて、その日付を決定するロジックがいかにクレイジー*であるかを発見しまし。春分!特定の年のイースターの日付を計算する既存の関数を知っている人はいますか?

確かに、それを行うのはおそらくそれほど難しいことではありません誰かがすでにこれを行っている場合に備えて尋ねると思いました。(そして、それは非常に可能性が高いようです。)

更新: 実は、聖金曜日(イースターのの金曜日)の日付を本当に探しています... イースターが私をそこに連れて行くだろうと思った. 私はアメリカにいるので、カトリックのイースターを探していると思いますか? しかし、私が間違っていれば、誰かが私を訂正してくれるかもしれません。

*「クレイジー」とは、関与するような意味でした。攻撃的なものではありません...

4

8 に答える 8

34

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

米国に関連するものを選択できます。

結果から 2 日を減らすと、グッド フライデーになります。

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

奇妙なことに、誰かがこれを繰り返していて、アルゴリズムに関するウィキペディアの記事で結果を公開しました。

代替テキスト

于 2010-02-03T14:23:05.453 に答える
14

SQL Server の復活祭の日曜日は次のようになります。グッド フライデーまで下にスクロールします。

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

グッド フライデーはこんな感じで、上記の Easter 関数を使用します

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

于 2010-02-03T14:26:23.580 に答える
4

これ(曜日と休日に基づく交通量予測)を書くことになったとき、私は自分で書くことをあきらめました。ネットのどこかで見つけました。コードはパブリックドメインでしたが...

はぁ

自分で見て。

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
}

いくつかの質問は、聞かないほうがよいでしょう。

私の国のすべての移動祭日がイースターの日付から一定のオフセットであることを幸運に思います.

于 2010-02-03T14:41:31.063 に答える
2

以下のSQL Server関数は、受け入れられた回答よりも一般的です

受け入れられた回答は、1900-04-15 から 2099-04-12 までの範囲 (包括的) に対してのみ正しいものです。

米国海軍天文台 (USNO) が提供するアルゴリズムを使用します。

http://aa.usno.navy.mil/faq/docs/easter.php

CREATE FUNCTION dbo.GetEasterSunday (@Y INT)
RETURNS DATETIME
AS
    BEGIN 

        -- Source of algorithm : http://aa.usno.navy.mil/faq/docs/easter.php

        DECLARE @c INT = @Y / 100
        DECLARE @n INT = @Y - 19 * (@Y / 19)
        DECLARE @k INT = (@c - 17) / 25
        DECLARE @i INT = @c - @c / 4 - (@c - @k) / 3 + 19 * @n + 15
        SET @i = @i - 30 * (@i / 30)
        SET @i = @i - (@i / 28) * (1 - (@i / 28) * (29 / (@i + 1)) * ((21 - @n) / 11))
        DECLARE @j INT = @Y + @Y / 4 + @i + 2 - @c + @c / 4
        SET @j = @j - 7 * (@j / 7)
        DECLARE @l INT = @i - @j
        DECLARE @m INT = 3 + (@l + 40) / 44
        DECLARE @d INT = @l + 28 - 31 * (@m / 4)

        RETURN 
    ( 
        SELECT CONVERT 
        (  DATETIME, 
                 RTRIM(@Y)  
            + RIGHT('0'+RTRIM(@m), 2)  
            + RIGHT('0'+RTRIM(@d), 2)  
    ) 
    )
    END 


GO
于 2016-08-01T12:13:21.533 に答える