计算基督教节日






4.11/5 (20投票s)
计算基督教节日的日期,如复活节、耶稣升天节等。
引言
我在寻找一种计算复活节星期日日期的方法,然后我在 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 样式的注释进行记录,从而可以轻松地将其集成到您的应用程序或类库中。
致谢
- 感谢 Oskar Wieland 发布原始 C++ 代码,这使我开始了这项工作。
- 感谢 Jean Meeus 为我提供此维基百科链接,以获取有关如何计算复活节和其他基督教节日的更多信息。
- 感谢 Sire404 指出我的
EasterSunday
方法中的错误。