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)
{
return EasterSunday(year).AddDays(39);
}
Whit Sunday
Whit Sunday is 7 weeks after Easter Sunday.
public static DateTime WhitSunday(int year)
{
return EasterSunday(year).AddDays(49);
}
For the other calculations please refer to the source code which you can download.
Calculating first Sunday of Advent
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.