Click here to Skip to main content
Click here to Skip to main content
Go to top

Calculating Christian Holidays

, 18 Jul 2005
Rate this:
Please Sign up or sign in to vote.
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)
{
    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)

Share

About the Author

Jan Schreuder
Software Developer (Senior)
Netherlands Netherlands
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/

Comments and Discussions

 
NewsComputus in scala and java Pinmembermike mainguy23-Apr-11 3:48 
GeneralGood article PinmemberDonsw21-Dec-08 10:38 
GeneralRe: Good article PinmemberDonsw21-Dec-08 10:42 
GeneralNot all Christians observe the same Easter period PinmemberGerard Nicol19-Jul-05 12:12 
GeneralRe: Not all Christians observe the same Easter period PinmemberJan Schreuder19-Jul-05 19:45 
GeneralInteresting article PinmemberJudah Himango18-Jul-05 9:03 
GeneralThe algorithm is incorrect PinmemberSire40413-Jul-05 21:56 
GeneralRe: The algorithm is incorrect PinmemberBorrisholt5-Mar-08 2:51 
GeneralRe: The algorithm is incorrect PinmemberSire4045-Mar-08 3:11 
GeneralRe: The algorithm is incorrect PinmemberJan Schreuder5-Mar-08 9:01 
GeneralRe: The algorithm is incorrect Pinmemberdigimanus24-May-11 9:05 
GeneralJean Meeus PinmemberKeith Farmer1-Jul-05 8:34 
GeneralRe: Jean Meeus PinmemberKeith Farmer1-Jul-05 8:36 
GeneralRe: Jean Meeus PinmemberJan Schreuder2-Jul-05 9:36 
GeneralRe: Jean Meeus PinmemberKeith Farmer2-Jul-05 12:32 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

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