12,757,220 members (38,769 online)
alternative version

Stats

78.6K views
35 bookmarked
Posted 30 Jun 2005

Calculating Christian Holidays

, 19 Jul 2005 CPOL
 Rate this:
Calculate dates for christian holidays such as Easter, Ascension day etc.

Introduction

I was looking for a way to calculate the date for Easter Sunday when I found Oskar Wieland's article, Calculating Easter Sunday, here at Code Project. It describes a method in C++ and I needed the code in C#. I then realized that Easter is not the only Christian holiday that can be calculated. Some are directly related to Easter, others are related to Christmas. I therefore created a simple C# class that will return dates for the following Christian Holidays:

• Easter Sunday
• Good Friday (Friday before Easter Sunday)
• Palm Sunday (1 week before Easter Sunday)
• Whit Sunday (7 weeks after Easter Sunday)
• Ascension Day (10 days before Whit Sunday)
• Ash Wednesday (47 days before Easter)
• First Sunday of Advent (The Sunday between November 26 and December 3)

The holidays calculated by this class are the major Christian holidays. All others can be calculated using one of these methods, or have a fixed date in the year.

Oskar Wieland's algorithm in C#

I converted the original C++ code to C# first. But I was pointed to the fact that sometimes the routine returns incorrect values. See the response by Sire404 below. I updated the code using that response. The algorithm to calculate Easter Sunday is shown here:

```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;
}
}```

The next step was creating an overloaded version of this method which returns a `DateTime` value. That method forms the basis for all Easter related date methods:

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

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

Calculating other dates

Now that the code to calculate Easter Sunday is ready, creating calculations for other dates based on Easter Sunday is very simple. All we need to know is how these dates are related to Easter. Below you will find the code that will calculate the dates for Ascension Day and Whit Sunday.

Ascension Day

Ascension Day is 10 days before Whit Sunday, or 39 days after Easter.

```public static DateTime AscensionDay(int year)
{
}```

Whit Sunday

Whit Sunday is 7 weeks after Easter Sunday.

```public static DateTime WhitSunday(int year)
{
}```

The first Sunday of Advent, is related to Christmas. The first Sunday of Advent is the 4th Sunday before Christmas, between November 26 and December 3. So to calculate that date, I use the following algorithm:

```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));
}```

Using the code

The code should work fine in any version of Visual Studio .NET, but the demo application was written in Visual Studio 2003. All methods are documented using XML-style comments making it easy to integrate it into your applications or class libraries.

Credits

• Oskar Wieland for posting the original C++ code which got me started.
• Jean Meeus for providing me this link to Wikipedia for more information on how Easter and other Christian Holidays can be calculated.
• Sire404 for pointing out the bug in my `EasterSunday` method.

Share

I'm a professional software developer for a small company in the Netherlands. I have been developing software since 1988 in C, Visual Basic and C#. My main focus is now on problem analysis in IT projects.

You may also be interested in...

 First Prev Next
 and the laziest version to calc easternsunday in c# (thx to gaus) caosFrank12-Jan-17 23:24 caosFrank 12-Jan-17 23:24
 Incomplete article -- Calculation for non-Catholic ("Eastern") Easter dc_20003-Sep-15 13:30 dc_2000 3-Sep-15 13:30
 Re: Incomplete article -- Calculation for non-Catholic ("Eastern") Easter Jan Schreuder19-Jan-16 22:12 Jan Schreuder 19-Jan-16 22:12
 Re: Incomplete article -- Calculation for non-Catholic ("Eastern") Easter dc_200026-Jan-16 15:33 dc_2000 26-Jan-16 15:33
 Computus in scala and java mike mainguy23-Apr-11 4:48 mike mainguy 23-Apr-11 4:48
 Good article Donsw21-Dec-08 11:38 Donsw 21-Dec-08 11:38
 Re: Good article Donsw21-Dec-08 11:42 Donsw 21-Dec-08 11:42
 Not all Christians observe the same Easter period Gerard Nicol19-Jul-05 13:12 Gerard Nicol 19-Jul-05 13:12
 Re: Not all Christians observe the same Easter period Jan Schreuder19-Jul-05 20:45 Jan Schreuder 19-Jul-05 20:45
 Interesting article Judah Himango18-Jul-05 10:03 Judah Himango 18-Jul-05 10:03
 The algorithm is incorrect Sire40413-Jul-05 22:56 Sire404 13-Jul-05 22:56
 Re: The algorithm is incorrect Borrisholt5-Mar-08 3:51 Borrisholt 5-Mar-08 3:51
 Re: The algorithm is incorrect Sire4045-Mar-08 4:11 Sire404 5-Mar-08 4:11
 Re: The algorithm is incorrect Jan Schreuder5-Mar-08 10:01 Jan Schreuder 5-Mar-08 10:01
 Re: The algorithm is incorrect digimanus24-May-11 10:05 digimanus 24-May-11 10:05
 Jean Meeus Keith Farmer1-Jul-05 9:34 Keith Farmer 1-Jul-05 9:34
 Re: Jean Meeus Keith Farmer1-Jul-05 9:36 Keith Farmer 1-Jul-05 9:36
 Re: Jean Meeus Jan Schreuder2-Jul-05 10:36 Jan Schreuder 2-Jul-05 10:36
 Re: Jean Meeus Keith Farmer2-Jul-05 13:32 Keith Farmer 2-Jul-05 13:32
 Last Visit: 31-Dec-99 19:00     Last Update: 23-Feb-17 18:05 Refresh 1