/** | |
* 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]; | |
} |
Thanks a lot for this
I am using this here: Easter Dates
Thanks!
Is it just me or is the function returning Easter Monday this year? Happy Easter, anyway!
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.
getEaster(2020);
returns
[4, 12]
for me...
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.
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,
Thanks @Termplexed! Fixed.
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 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
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
Thanks @johndyer!
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).