Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@johndyer
Last active April 9, 2024 16:28
Show Gist options
  • Star 26 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save johndyer/0dffbdd98c2046f41180c051f378f343 to your computer and use it in GitHub Desktop.
Save johndyer/0dffbdd98c2046f41180c051f378f343 to your computer and use it in GitHub Desktop.
Calculate Easter in JavaScript
/**
* Calculates Easter in the Gregorian/Western (Catholic and Protestant) calendar
* based on the algorithm by Oudin (1940) from http://www.tondering.dk/claus/cal/easter.php
* @returns {array} [int month, int day]
*/
function getEaster(year) {
var f = Math.floor,
// Golden Number - 1
G = year % 19,
C = f(year / 100),
// related to Epact
H = (C - f(C / 4) - f((8 * C + 13)/25) + 19 * G + 15) % 30,
// number of days from 21 March to the Paschal full moon
I = H - f(H/28) * (1 - f(29/(H + 1)) * f((21-G)/11)),
// weekday for the Paschal full moon
J = (year + f(year / 4) + I + 2 - C + f(C / 4)) % 7,
// number of days from 21 March to the Sunday on or before the Paschal full moon
L = I - J,
month = 3 + f((L + 40)/44),
day = L + 28 - 31 * f(month / 4);
return [month,day];
}
@tdiluzio
Copy link

Thanks @johndyer and @wysal 👍

@P06316
Copy link

P06316 commented Nov 26, 2021

This algorithm seems to fail for year 2022 returning 23.04 instead of 17.04. Works fine for any other year I tried. Any idea on why that might be? I'm really curious and couldn't find explanation.

I had the same issue and solved it by applying parseInt(myYear, 0) on the variable containing the year.

console.log(getEaster("2022")); //Returns [4, 23] => NOK
console.log(getEaster(2022)); //Returns [4, 17] => OK
console.log(getEaster(parseInt("2022", 0))); //Returns [4, 17] => OK

@PenkoMlakar
Copy link

Thanks @johndyer!

@TheDoomfire
Copy link

Thanks seem to work!

Was wondering if it's possible to get the good Friday from this? Since it's the Friday before Easter.

So I guess day - 2 will do for most cases at least.

@CraigDavison
Copy link

When using this, I was passing the year in from an form input and it seems as though, only odd numbered years, returned the correct date (being Easter Sunday). The answer was to ensure the value passed in was an integer so added a line at the top of the function.

year = parseInt(year)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment