easter_date() in JavaScript

2019-02-14 04:02发布

问题:

I'm making a calendar generator in JavaScript. I need the Unix Timestamp for easter day midnight, for a given year. Can anyone tell me how I need to do that (in JavaScript)?

Thanks in advance.

PHP's function can be found here: http://www.php.net/easter_date

回答1:

According to this:-

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);

    return padout(M) + '.' + padout(D);
}

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

Example usage:-

document.write(Easter(1997));


回答2:

Have a look at the PHP source code to see how they calculate theirs and replicate in JavaScript?



回答3:

Here's an alternative method based on an algorithm that R. Sivaraman adapted for the Gregorian Calendar from an algorithm originally developed by J. Meeus for the Julian calendar (cf. https://en.wikipedia.org/wiki/Computus).

It seems like a more elegant and intuitive solution than the Gauss algorithm which has already been mentioned. At least it shaves off a few steps (only 5 total plus the JS date methods) and uses fewer variables (only 4 total plus the month, date, and year).

function computus( y ) {

        var date, a, b, c, m, d;

        // Instantiate the date object.
        date = new Date;

        // Set the timestamp to midnight.
        date.setHours( 0, 0, 0, 0 );

        // Set the year.
        date.setFullYear( y );

        // Find the golden number.
        a = y % 19;

        // Choose which version of the algorithm to use based on the given year.
        b = ( 2200 <= y && y <= 2299 ) ?
            ( ( 11 * a ) + 4 ) % 30 :
            ( ( 11 * a ) + 5 ) % 30;

        // Determine whether or not to compensate for the previous step.
        c = ( ( b === 0 ) || ( b === 1 && a > 10 ) ) ?
            ( b + 1 ) :
            b;

        // Use c first to find the month: April or March.
        m = ( 1 <= c && c <= 19 ) ? 3 : 2;

        // Then use c to find the full moon after the northward equinox.
        d = ( 50 - c ) % 31;

        // Mark the date of that full moon—the "Paschal" full moon.
        date.setMonth( m, d );

        // Count forward the number of days until the following Sunday (Easter).
        date.setMonth( m, d + ( 7 - date.getDay() ) );

        // Gregorian Western Easter Sunday
        return date;

    }

For example:

console.log( computus( 2016 ) ); // Date 2016-03-27T05:00:00.000Z


回答4:

Here's one implementation. Can't vouch for it's accuracy.

http://users.sa.chariot.net.au/~gmarts/eastalg.htm#easterscript