JavaScript中的easter_date()

6 javascript datetime unix-timestamp computus

我正在使用JavaScript制作日历生成器.对于给定的一年,我需要复活节当天午夜的Unix时间戳.任何人都可以告诉我如何做到这一点(在JavaScript中)?

提前致谢.

PHP的功能可以在这里找到:http://www.php.net/easter_date

Gav*_*our 18

根据这个: -

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; }
Run Code Online (Sandbox Code Playgroud)

用法示例: -

document.write(Easter(1997));
Run Code Online (Sandbox Code Playgroud)

  • 如果要返回日期,请去掉“padout”函数并将返回语句更改为:“return new Date(Y, M-1, D);” (2认同)

Reu*_*lie 6

这是一种基于算法的替代方法,R. Sivaraman 根据最初由 J. Meeus 为儒略历开发的算法(参见https://en.wikipedia.org/wiki/Computus)为公历改编了该算法。

与已经提到的高斯算法相比,这似乎是一种更优雅、更直观的解决方案。至少它减少了几个步骤(总共只有 5 个加上 JS日期方法)并使用更少的变量(总共只有 4 个加上月份、日期和年份)。

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;

    }
Run Code Online (Sandbox Code Playgroud)

例如:

console.log( computus( 2016 ) ); // Date 2016-03-27T05:00:00.000Z
Run Code Online (Sandbox Code Playgroud)