Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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];
}
@DHFW

This comment has been minimized.

Copy link

@DHFW DHFW commented May 29, 2019

Thank you!

For others: be aware that this returns the month as 1 = January, 2 = February and so on.

I subtracted the month with one to be able to convert it to a Javascript Date easily in which the month is index based (0 = January, 1 = February).

@varvino

This comment has been minimized.

Copy link

@varvino varvino commented Feb 6, 2020

Thanks a lot for this

@gavinr

This comment has been minimized.

Copy link

@gavinr gavinr commented Mar 10, 2020

I am using this here: Easter Dates
Thanks!

@johndyer

This comment has been minimized.

Copy link
Owner Author

@johndyer johndyer commented Mar 10, 2020

@sunsero

This comment has been minimized.

Copy link

@sunsero sunsero commented Apr 11, 2020

Is it just me or is the function returning Easter Monday this year? Happy Easter, anyway!

@johndyer

This comment has been minimized.

Copy link
Owner Author

@johndyer johndyer commented Apr 11, 2020

@sunsero

This comment has been minimized.

Copy link

@sunsero sunsero commented Apr 11, 2020

Don't think so because Easter Sunday is calculated for 2019 and for 2021 correctly. If it matters I'm during summer time in UTC+2, in winter in UTC+1.

@johndyer

This comment has been minimized.

Copy link
Owner Author

@johndyer johndyer commented Apr 11, 2020

getEaster(2020);
returns
[4, 12]
for me...

@sunsero

This comment has been minimized.

Copy link

@sunsero sunsero commented Apr 11, 2020

Thanks, you're right - if I pass 2020 as a constant value rather than in a variable it gives the correct result. I'll have to figure out what's going on.

@Termplexed

This comment has been minimized.

Copy link

@Termplexed Termplexed commented Mar 1, 2021

Minor nuisance. On line 12 there is thin-space in stead of normal space. (0x2009 instead of 0x20) in C - f

		H = (C<0x2009>-<0x2009>f(C / 4) - f((8 * C + 13)/25) + 19 * G + 15) % 30,
@johndyer

This comment has been minimized.

Copy link
Owner Author

@johndyer johndyer commented Mar 1, 2021

Thanks @Termplexed! Fixed.

@creat73

This comment has been minimized.

Copy link

@creat73 creat73 commented Apr 1, 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.

@wysal

This comment has been minimized.

Copy link

@wysal wysal commented Jun 9, 2021

I needed to count days up from easter for public holidays calculation so I did some adaptions:

function getEaster(year, plusdays) {
var f = Math.floor,
G = year % 19,
C = f(year / 100),
H = (C - f(C / 4) - f((8 * C + 13) / 25) + 19 * G + 15) % 30,
I = H - f(H / 28) * (1 - f(29 / (H + 1)) * f((21 - G) / 11)),
J = (year + f(year / 4) + I + 2 - C + f(C / 4)) % 7,
L = I - J,
month = 3 + f((L + 40) / 44),
day = L + 28 - 31 * f(month / 4);
return new Date(year, month - 1, day + plusdays);
}

so this would then output for example Easter Monday:
getEaster(2022, 1)

in case of need for someone

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