65.9K
CodeProject 正在变化。 阅读更多。
Home

计算基督教节日

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (20投票s)

2005 年 7 月 1 日

CPOL

2分钟阅读

viewsIcon

125112

downloadIcon

991

计算基督教节日的日期,如复活节、耶稣升天节等。

引言

我在寻找一种计算复活节星期日日期的方法,然后我在 Code Project 上找到了Oskar Wieland 的文章,计算复活节星期日。它描述了一种 C++ 方法,而我需要 C# 代码。然后我意识到,复活节不是唯一可以计算的基督教节日。有些与复活节直接相关,另一些与圣诞节相关。因此,我创建了一个简单的 C# 类,它将返回以下基督教节日的日期:

  • 复活节星期日
  • 耶稣受难日(复活节星期日前的星期五)
  • 棕枝全日(复活节星期日前的 1 周)
  • 圣灵降临节(复活节星期日后的 7 周)
  • 耶稣升天日(圣灵降临节前的 10 天)
  • 圣灰星期三(复活节前的 47 天)
  • 将临期第一主日(11 月 26 日至 12 月 3 日之间的星期日)

此类计算的节日是主要的基督教节日。所有其他节日都可以使用这些方法之一计算,或者在一年中有一个固定的日期。

Oskar Wieland 的 C# 算法

我首先将原始 C++ 代码转换为 C#。但我被指出,有时该例程会返回不正确的值。请参阅 Sire404 下面的回复。我使用该回复更新了代码。计算复活节星期日的算法如下所示:

public static void EasterSunday(int year, ref int month, ref int day)
{
    int g = year % 19;
    int c = year / 100;
    int h = h = (c - (int)(c / 4) - (int)((8 * c + 13) / 25) 
                                        + 19 * g + 15) % 30;
    int i = h - (int)(h / 28) * (1 - (int)(h / 28) * 
                (int)(29 / (h + 1)) * (int)((21 - g) / 11));

    day   = i - ((year + (int)(year / 4) + 
                  i + 2 - c + (int)(c / 4)) % 7) + 28;
    month = 3;

    if (day > 31)
    {
        month++;
        day -= 31;
    }
}

下一步是创建此方法的重载版本,该版本返回一个 DateTime 值。该方法构成了所有与复活节相关的日期方法的基础

public static DateTime EasterSunday(int year)
{
    int month = 0;
    int day = 0;
    EasterSunday(year, out month, out day);

    return new DateTime(year, month, day);
}

计算其他日期

现在计算复活节星期日的代码已准备就绪,创建基于复活节星期日的其他日期的计算非常简单。我们只需要知道这些日期与复活节的关系即可。在下面,您将找到计算耶稣升天节和圣灵降临节日期的代码。

耶稣升天日

耶稣升天日是圣灵降临节前的 10 天,或复活节后的 39 天。

public static DateTime AscensionDay(int year)
{
    return EasterSunday(year).AddDays(39);
}

圣灵降临节

圣灵降临节是复活节星期日后的 7 周。

public static DateTime WhitSunday(int year)
{
    return EasterSunday(year).AddDays(49);
}

对于其他计算,请参阅您可以下载的源代码。

计算将临期第一主日

将临期第一主日与圣诞节有关。将临期第一主日是圣诞节前的第 4星期日,介于 11 月 26 日至 12 月 3 日之间。因此,为了计算该日期,我使用以下算法:

public static DateTime FirstSundayOfAdvent(int year)
{
    int weeks = 4;
    int correction = 0;
    DateTime christmas = new DateTime(year, 12, 25);

    if (christmas.DayOfWeek != DayOfWeek.Sunday)
    {
        weeks--;
        correction = ((int)christmas.DayOfWeek - (int)DayOfWeek.Sunday);
    }
    return christmas.AddDays(-1 * ((weeks * 7) + correction));
}

使用代码

该代码应可在任何版本的 Visual Studio .NET 中正常工作,但演示应用程序是用 Visual Studio 2003 编写的。所有方法都使用 XML 样式的注释进行记录,从而可以轻松地将其集成到您的应用程序或类库中。

致谢

© . All rights reserved.