Click here to Skip to main content
Click here to Skip to main content

Calculating Christian Holidays

By , 18 Jul 2005
 

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.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Jan Schreuder
Software Developer (Senior)
Netherlands Netherlands
Member
I'm a professional software developer for a large company in the Netherlands. I have been developing software since 1988 in C, Visual Basic and C#.
 
I also blog about my work and .Net related issues on my weblog: http://bloggingabout.net/blogs/jschreuder/

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
NewsComputus in scala and javamembermike mainguy23 Apr '11 - 3:48 
GeneralGood articlememberDonsw21 Dec '08 - 10:38 
GeneralRe: Good articlememberDonsw21 Dec '08 - 10:42 
GeneralNot all Christians observe the same Easter periodmemberGerard Nicol19 Jul '05 - 12:12 
GeneralRe: Not all Christians observe the same Easter periodmemberJan Schreuder19 Jul '05 - 19:45 
GeneralInteresting articlememberJudah Himango18 Jul '05 - 9:03 
GeneralThe algorithm is incorrectmemberSire40413 Jul '05 - 21:56 
GeneralRe: The algorithm is incorrectmemberBorrisholt5 Mar '08 - 2:51 
GeneralRe: The algorithm is incorrectmemberSire4045 Mar '08 - 3:11 
GeneralRe: The algorithm is incorrectmemberJan Schreuder5 Mar '08 - 9:01 
GeneralRe: The algorithm is incorrectmemberdigimanus24 May '11 - 9:05 
GeneralJean MeeusmemberKeith Farmer1 Jul '05 - 8:34 
GeneralRe: Jean MeeusmemberKeith Farmer1 Jul '05 - 8:36 
GeneralRe: Jean MeeusmemberJan Schreuder2 Jul '05 - 9:36 
GeneralRe: Jean MeeusmemberKeith Farmer2 Jul '05 - 12:32 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 19 Jul 2005
Article Copyright 2005 by Jan Schreuder
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid