2009-08-16 2 views

Répondre

14

Selon 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; } 

Exemple d'utilisation: -

document.write(Easter(1997)); 
+0

Merci, je laisse mes autres fonctions convertissent en un horodatage Unix –

+0

Pour 2016, il donne « 03.27 », qui est « le dimanche de Pâques » pour 2016. Ainsi correcte pour 2016 ... – Tompi

2

Jetez un oeil au code source de PHP pour voir comment ils leur calculer et répliquent en JavaScript ?

+0

Omg, PHP est open source? Eh bien, je ne savais pas que: p –

+2

Pour référence la source mentionnée: https://github.com/php/php-src/blob/c8aa6f3a9a3d2c114d0c5e0c9fdd0a465dbb54a5/ext/calendar/easter.c – s1lence

1

Voici une méthode alternative basée sur un algorithme que R. Sivaraman a adapté pour le calendrier grégorien à partir d'un algorithme développé à l'origine par J. Meeus pour le calendrier julien (voir https://en.wikipedia.org/wiki/Computus).

Cela semble être une solution plus élégante et plus intuitive que l'algorithme de Gauss déjà mentionné. Au moins, il rase quelques étapes (seulement 5 au total plus le JS date methods) et utilise moins de variables (seulement 4 au total plus le mois, la date et l'année).

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; 

    } 

Par exemple:

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

Pourquoi votre résultat comprend le 05: 00: 00.000 partie? Est-ce parce que le temps est en UTC? Cela m'inquiète si votre algorithme est vraiment indépendant du fuseau horaire. – josch