# Easter

You are here: irt.org | Articles | JavaScript | Date and Time | Easter [ previous next ]

Published on: Saturday 6th December 1997 By: Martin Webb

## Introduction

Easter n. (also Easter Day or Easter Sunday) the festival (held on variable Sunday in March or April) commemorating Christ's resurrection.

This article will describe how to calculate the date of Easter Sunday, "held on a variable Sunday in March or April". This date will then be used to calculate other religious dates dependent on Easter Sunday.

## Easter Sunday

The following algorithim is taken from Calendars and their History available at http://astro.nmsu.edu/~lhuber-leaphist.html:

The following algorithm for computing the date of Easter is based on the algorithm of Oudin (1940). It is valid for any Gregorian year, Y. All variables are integers and the remainders of all divisions are dropped. The final date is given by M, the month, and D, the day of the month.

C = Y/100,
N = Y - 19*(Y/19),
K = (C - 17)/25,
I = C - C/4 - (C - K)/3 + 19*N + 15,
I = I - 30*(I/30),
I = I - (I/28)*(1 - (I/28)*(29/(I + 1))*((21 - N)/11)),
J = Y + Y/4 + I + 2 - C + C/4,
J = J - 7*(J/7),
L = I - J,
M = 3 + (L + 40)/44,
D = L + 28 - 31*(M/4).

This can be converted into the following simple script, where Math.floor converts floating point numbers to integers:

```function Easter(Y) {
var C = Math.floor(Y/100);
var N = Y - 19*Math.floor(Y/19);
var K = Math.floor((C - 17)/25);
var I = C - Math.floor(C/4) - Math.floor((C - K)/3) + 19*N + 15;
I = I - 30*Math.floor((I/30));
I = I - Math.floor(I/28)*(1 - Math.floor(I/28)*Math.floor(29/(I + 1))*Math.floor((21 - N)/11));
var J = Y + Math.floor(Y/4) + I + 2 - C + Math.floor(C/4);
J = J - 7*Math.floor(J/7);
var L = I - J;
var M = 3 + Math.floor((L + 40)/44);
var D = L + 28 - 31*Math.floor(M/4);

}```

`function padout(number) { return (number < 10) ? '0' + number : number; }`

Therefore the Easter() function returns a number in the format MM.DD where MM is the number of the month, and DD is the day within the month MM.

For example:

`document.write(Easter(1997));`

When run produces:

i.e. the 30th April 1997.

To retrieve the month and day from this string, we can use the following simple functions getMM() and getDD():

```function getMM(string) { return eval(string.substring(0,2)); }

function getDD(string) { return eval(string.substring(3,2)); }```

For example

```var when = Easter(1997);
document.write('Day = ' + getDD(when) + ' Month = ' + getMM(when));```

When run produces:

## Other Religious Dates

Quite a few of the religious dates are dependent on the date of Easter:

Fixed Dates:

• Christmas 25th December
• Assumption 15th August

Variable:

• Septuagesima Sunday = Easter Sunday -63 days
• Sexagesima Sunday = Easter Sunday -56 days
• Shrove Sunday = Easter Sunday -49 days
• Shrove Tuesday = Easter Sunday -47 days
• Ash Wednesday = Easter Sunday -46 days
• Passion Sunday = Easter Sunday -14 days
• Palm Sunday = Easter Sunday -7 days
• Holy or Maundy Thursday = Easter Sunday -3 days
• Good Friday = Easter Sunday -2 days
• Rogation Sunday = Easter Sunday +35 days
• Ascension Day = Easter Sunday +39 days
• Pentecost or Whitsunday = Easter Sunday +49 days
• Whitmundy = Easter Sunday +50 days
• Trinity Sunday = Easter Sunday +56 days
• Corpus Christi = Easter Sunday +60 days (or Easter Sunday +63 days Catholic Church in the United States)

So how do we subtract or add days to a date and get another date?

Simple we number each day of the year from 1 to 365 (or 366 in a leap year), i.e. we use the Julian Day format used by NASA. We can then easily subtract or add a number to produce another numbered day of the year.

All we need to be able to do is convert a date to and from this Julian Day format. To do this we can utilise the following two accumulate[] and accumulateLY[] arrays, which use the makeArray() function described in the previous article Blind Date:

```var accumulate    = new makeArray(  0, 31, 59, 90,120,151,181,212,243,273,304,334);
var accumulateLY  = new makeArray(  0, 31, 60, 91,121,152,182,213,244,274,305,335);```

The accumulate[] array holds the accumulation of the number of days in each month. For example, the 13th of January converts to 0 + 13 = day 13, whereas the 24th of August converts to 212 + 24 = day 236.

For leap years we need to use the accumulateLY[] array. To detect a leap year we use LeapYear() function described in the previous article Blind Date.

The following addDays() function will add or subtract a number of days (addition) to a date and return the new date in the format YYYY.MM.DD:

```function addDays(day,month,year,addition) {
if (LeapYear(year)) var number = day + accumulateLY[month] + addition;
else                var number = day + accumulate[month]   + addition;

var days = daysinyear(year);

while (number > days) {
number -= days;
days = daysinyear(++year);
}

while (number < 1) {
days = daysinyear(--year);
number += days;
}

month = 1;

if (LeapYear(year)) {
while (number > accumulateLY[month]) { month++; }
day = number - accumulateLY[--month];
}
else {
while (number > accumulate[month]) { month++; }
day = number - accumulate[--month];
}

}

function daysinyear(year) { if (LeapYear(year)) return 366; else return 365; }```

For example:

```document.write(addDays(1,1,1997,-1)+'<BR>');

When run produces:

To retrieve the year, month and day from the string returned we use the getYYYY() and getMMDD() functions along with the previously described getMM() and getDD() functions:

```function getYYYY(string) {
return eval(string.substring(0,string.indexOf('.')));
}

function getMMDD(string) {
return string.substring(string.indexOf('.')+1,string.length);
}```

For example:

```var when = addDays(1,1,1997,-1);
var ddmm = getMMDD(when);
document.write('Day = ' + getDD(ddmm) + ' Month = ' + getMM(ddmm) + ' Year = ' + getYYYY(when) + '<BR>');
var ddmm = getMMDD(when);
document.write('Day = ' + getDD(ddmm) + ' Month = ' + getMM(ddmm) + ' Year = ' + getYYYY(when) + '<BR>');```

When run produces the following:

We can pretty this date by using the FullDate() function described in the previous article Monday's child is full of grace:

```var when = addDays(1,1,1997,358);
var ddmm = getMMDD(when);
document.write('Christmas Day - ' + FullDate(getDD(ddmm),getMM(ddmm),getYYYY(when))+'<BR>');```

Which when run produces:

Christmas Day - Thursday 25th December 1997

## Working Example

Try the frame version which shows all the religious dates for the current year.

## Source Code

You can view the source code of the four components:

## Related items

JavaScript Y2K Issues

And now...The Weekly Update Script

The 24 Hour World

Today's The Day

Extending "Born of the 4th of July"

The 3rd Saturday in November

Born on the 4th of July

The Chinese New Year

What sign are you?