gtoubiana / acte

Une librairie JavaScript qui simplifie la recherche généalogique.
http://gtoubiana.github.io/acte/
MIT License
0 stars 0 forks source link

Calcul des fêtes mobiles #6

Closed gtoubiana closed 3 years ago

gtoubiana commented 8 years ago

From @gtoubiana on March 14, 2014 7:53

Voir http://jsfiddle.net/toubia95/YLhes/ et http://www.imcce.fr/langues/fr/grandpublic/temps/dates_paques.php#la détermination de la date de Pâques

Copied from original issue: gtoubiana/bms.js#10

gtoubiana commented 8 years ago

Fonctionne à partir de l'an 325 pour la paques chrétienne avec IMCCE (comme Heredis) Fonctionne à partir de l'an 1583 pour l'autre

gtoubiana commented 8 years ago

Proposition de nomenclature :

gnjs.mf(y) for movable feasts gnjs.mf(y).st for Shrove Tuesday gnjs.mf(y).aw for Ash Wednesday gnjs.mf(y).ps for Palm Sunday gnjs.mf(y).ce for Christian Easter Sunday gnjs.mf(y).at for Ascension Thursday gnjs.mf(y).ps for Pentecost Sunday gnjs.mf(y).ts for Trinity Sunday gnjs.mf(y).cc for Corpus Christi gnjs.mf(y).oe for Orthodox Easter gnjs.mf(y).je for Jewish Easter

gtoubiana commented 8 years ago

Voir http://fr.wikipedia.org/wiki/Comput

gtoubiana commented 8 years ago

Voir http://www.imcce.fr/fr/grandpublic/temps/calendriers/cal552.php

gtoubiana commented 8 years ago

Utiliser les fonctions de Fourmilab si possible...

gtoubiana commented 8 years ago

Javascripts : http://www.merlyn.demon.co.uk/holydays.htm

Javascript et formules : http://pgj.pagesperso-orange.fr/paques.htm

Autre : http://www.friesian.com/easter.htm#golden http://www.smart.net/~mmontes/ec-cal.html http://www.smart.net/~mmontes/ortheast.html http://catholic-resources.org/Lectionary/Calendar.htm http://www.oremus.org/liturgy/etc/ktf/app/easter.html http://catholicism.about.com/od/holydaysandholidays/f/Calculate_Date.htm http://www.imcce.fr/fr/grandpublic/temps/dates_paques.php

gtoubiana commented 7 years ago
gtoubiana commented 7 years ago

voir : https://www.imcce.fr/fr/grandpublic/temps/dates_paques.html

de 325 à 2500 après JC. Voir fonction couran() en 1er !

w = self;

function oar(OK,CODE1,CODE2) { /*objets a ranger*/
    this.OK
    this.CODE1
    this.CODE2
    this.CODE3
    this.CODE4
    this.CODE4J
    this.CODE5
    this.CODE6
    this.CYCLE
    this.ANC
    this.JSEM
     }

function date(JJD,AN,MOIS,JOUR,TYPEA,NBMOIS) {
    this.JJD
    this.AN
    this.MOIS
    this.JOUR
    this.TYPEA
    this.ESPEA
    this.NBMOIS
     }

function trunc(x) {
if (x>0.0) return(Math.floor(x));
else return Math.ceil(x);
}

function round(x) {
if (x>0.0) return(Math.floor(x+0.5));
else return Math.ceil(x-0.5);
}

 function JJDATEJ()
   {
     Z1=date.JJD+0.5;          
     Z=trunc(Z1);                                                               
     A=Z;                                                                       
     B=A+1524;                                                                  
     C=trunc((B-122.1)/365.25);                                                 
     D=trunc(365.25*C);                                                         
     E=trunc((B-D)/30.6001);                                                    
     date.JOUR=trunc(B-D-trunc(30.6001*E));     
     if(E<13.5)date.MOIS = trunc(E-1);      
      else date.MOIS = trunc(E-13);                
     if(date.MOIS>=3) date.AN = trunc(C-4716);       
      else   date.AN = trunc(C-4715);       
                    } 

function JJDATE ()
   {
     Z1=date.JJD+0.5;
     Z=trunc(Z1);                                                               
     if (Z<2299161) A=Z;                                                        
      else {ALPHA=trunc((Z-1867216.25)/36524.25);                               
           A=Z+1+ALPHA-trunc(ALPHA/4);}                                         
     B=A+1524;                                                                  
     C=trunc((B-122.1)/365.25);                                                 
     D=trunc(365.25*C);                                                         
     E=trunc((B-D)/30.6001);                                                    
     date.JOUR=trunc(B-D-trunc(30.6001*E));  
     if(E<13.5) date.MOIS = trunc(E-1);     
      else date.MOIS = trunc(E-13);           
     if(date.MOIS>=3) date.AN = trunc(C-4716);      
      else   date.AN = trunc(C-4715);         
    }

function BISG()
     /*         TYPEA = 0 annee commune.                         */
     /*         TYPEA = 1 annee bissextile.                      */

   { date.NBMOIS=12;
     date.TYPEA=0;
     if ((date.AN % 4)==0)               date.TYPEA=1;
     if ((date.AN % 100)==0 && (date.AN % 400)!=0) date.TYPEA=0;}

function BISJ()
     /*         TYPEA = 0 annee commune.                         */
     /*         TYPEA = 1 annee bissextile.                      */

   { date.NBMOIS=12;
     if ((date.AN % 4)==0) date.TYPEA=1; else date.TYPEA=0;  }

function BISI()
  {  oar.CYCLE=1+(date.AN-1)/19;
     oar.ANC=1+(date.AN-1)%19;
     aa=date.AN;
     aa=12*aa+5;
     a=aa%19;
     jjd=DEBANJ(date.AN);
     jjd1=DEBANJ(date.AN+1);
     dt=jjd1-jjd;
     if (a>6) {date.ESPEA=trunc(dt-352);
           date.TYPEA=0;
           date.NBMOIS=12;}
      else {date.ESPEA=trunc(dt-382);
           date.TYPEA=1;
           date.NBMOIS=13;}
      }

function DEBANJ(an)
   {   x1=392640; x2=121555; x3=272953;
       x4=492480; x5=347605; x6=365;
       aa=an;
       aa=12*aa+5;
       a=aa%19;
       t=(x1+x2*an+x3*a)/x4;
       t=t+x5+x6*an+a;
       jj=trunc(t);
       dt=t-jj;
       t=jj+1;
       t=t-trunc(t/7)*7;
       j=round(t);
       pjjd=jj+0.5;
       if (j==2 || j==4 || j==6) pjjd=jj+1.5;
       if (j==1 && a>6 && dt>=0.632870) pjjd=jj+2.5;
       if (j==0 && a>11 && dt>=0.897724) pjjd=jj+1.5;
       return(pjjd);
       }

function JULIEN()
   {  IJOUR=date.JOUR;
      Y=date.AN;
      M=date.MOIS;
      A = Y + M/100 + IJOUR/10000;
      if(date.MOIS<=2){Y=Y-1;M=M+12;};
      if(Y<0)     date.JJD = Math.ceil(365.25*Y-0.75);
      else date.JJD = Math.floor(365.25*Y);
      date.JJD = date.JJD+trunc(30.6001*(M+1))+IJOUR+1720994.5;
      if(A>1582.1014) date.JJD=date.JJD+2-trunc(Y/100)+trunc(trunc(Y/100)/4);
    }

function JULIENJ()
     { IJOUR=date.JOUR;
      Y=date.AN;
      M=date.MOIS;
      if(date.MOIS<=2) {Y=Y-1;M=M+12;};
      if(Y<0)     date.JJD = Math.ceil(365.25*Y-0.75);
      else date.JJD = Math.floor(365.25*Y);
      date.JJD = date.JJD+trunc(30.6001*(M+1))+IJOUR+1720994.5;
    }

function ISRJ()
 {  MOISC=new Array (
          1,31,60,89,118,148,177,207,236,266,295,325,
          1,31,60,90,119,149,178,208,237,267,296,326,
          1,31,61,91,120,150,179,209,238,268,297,327);
    MOISE=new Array (
          1,31,60,89,118,148,178,207,237,266,296,325,355,
          1,31,60,90,119,149,179,208,238,267,297,326,356,
          1,31,61,91,120,150,180,209,239,268,298,327,357);

      oar.CYCLE=(date.AN-1)/19 + 1;
      oar.ANC=1+(date.AN-1) % 19;
      AA=date.AN;
      AA=12*AA+5;
      A=AA%19;
      jjd1=DEBANJ(date.AN+1);
      jjd=DEBANJ(date.AN);
      DT=jjd1-jjd;
      if(A<=6)  { date.ESPEA=trunc(DT-382);
           date.JJD=jjd+MOISE[13*(date.ESPEA-1)+(date.MOIS-1)]-2+date.JOUR;
           date.NBMOIS=13;
           date.TYPEA=1; }
      else { date.ESPEA=trunc(DT-352);
           date.JJD=jjd+MOISC[12*(date.ESPEA-1)+(date.MOIS-1)]-2+date.JOUR;
           date.NBMOIS=12;
           date.TYPEA=0; };
     }

function JISR()
 {  MOISC=new Array (
          1,31,60,89,118,148,177,207,236,266,295,325,
          1,31,60,90,119,149,178,208,237,267,296,326,
          1,31,61,91,120,150,179,209,238,268,297,327);
    MOISE=new Array (
          1,31,60,89,118,148,178,207,237,266,296,325,355,
          1,31,60,90,119,149,179,208,238,267,297,326,356,
          1,31,61,91,120,150,180,209,239,268,298,327,357);

      Z1=date.JJD+0.5;
      Z=trunc(Z1);
      if(Z<2299161) AA=Z;
      else {ALPHA=trunc((Z-1867216.25)/36524.25);
           AA=Z+1+ALPHA-trunc(ALPHA/4);}
      B=AA+1524;
      C=trunc((B-122.1)/365.25);
      D=trunc(365.25*C);
      E=trunc((B-D)/30.6001);
      date.JOUR=trunc(B-D-trunc(30.6001*E));
      if(E<13.5)   date.MOIS=trunc(E-1);
      else  date.MOIS=trunc(E-13);
      if(date.MOIS>=3)    date.AN=trunc(C-4716);
      else    date.AN=trunc(C-4715);
      AAN=date.AN+3761;
      JJD1=DEBANJ(AAN);
      if(date.JJD<JJD1)  { date.AN=AAN-1; JJDEB=DEBANJ(date.AN);}
      else   { date.AN=AAN; JJDEB=JJD1; AAN=AAN+1;
           JJD1=DEBANJ(AAN);}
      oar.CYCLE=(date.AN-1)/19 + 1;
      oar.ANC=1+(date.AN-1) % 19;
      AA=date.AN;
      AA=12*AA+5;
      A=AA%19;
      if(A>6)   { TYPE1=0; date.TYPEA=0; }
      else { TYPE1=1; date.TYPEA=1; }
      DT=JJD1-JJDEB; ;
      if(TYPE1==1)     date.ESPEA=round(DT-382);
      else   date.ESPEA=round(DT-352);
      DT=date.JJD-JJDEB+1;
      ARGC=12*(date.ESPEA-1);  ARGE=13*(date.ESPEA-1);
      if(TYPE1==1) { if(DT>=MOISE[ARGE+12])
           { date.MOIS=13;
           date.JOUR=round(DT)-MOISE[ARGE+12]+1;}
           else for (I=0; I<12; I++)
           {
           if ((DT>=MOISE[ARGE+I]) &&
               (DT<MOISE[ARGE+I+1]))
               {date.JOUR=round(DT)-MOISE[ARGE+I]+1;
                date.MOIS=I+1;}
           }}
      else      { if(DT>=MOISC[ARGC+11])
           {date.MOIS=12;
           date.JOUR=round(DT)-MOISC[ARGC+11]+1;}
           else for (I=0; I<11; I++)
           {if ((DT>=MOISC[ARGC+I])
           && (DT<MOISC[ARGC+I+1]))
                {date.MOIS=I+1;
                date.JOUR=round(DT)-MOISC[ARGC+I]+1;}
               }
    }}

function NOMJOUR()
  {  A=((eval(date.JJD)+2.5)/7)%1.0;
     oar.JSEM=round(A*7);       }

function PAQUESG()
   {
with (Math) {
     A=floor(date.AN%19); B=floor(date.AN/100); C=floor(date.AN%100);
     /*E remplacé par Z car E dans Math est la cste d'Euler */
     D=floor(B/4); Z=floor(B%4); F=floor((B+8)/25);
     G=floor((B-F+1)/3); H=floor((19*A+B-D-G+15)%30);
     I=floor(C/4); K=floor(C%4); L=floor((32+2*Z+2*I-H-K)%7);
     M=floor((A+11*H+22*L)/451); N=floor((H+L-7*M+114)/31);
     P=(H+L-7*M+114)%31; date.MOIS=floor(N); date.JOUR=floor(P+1);
          }
   }

function  PAQUESJ()
   { 
with (Math) {
     A=floor(date.AN%4); B=floor(date.AN%7); C=floor(date.AN%19);
     /*E remplacé par Z car E dans Math est la cste d'Euler */
     D=floor((19*C+15)%30); Z=floor((2*A+4*B-D+34)%7);
     F=floor((D+Z+114)/31); G=floor((D+Z+114)%31);
     date.MOIS=Math.floor(F); date.JOUR=Math.floor(G+1);
            }
   }

function COMPUTJ()
   { 
     S=(date.AN+8)%28;
     oar.CODE1=S+1;
     I=(date.AN+2)%15;
     oar.CODE2=I+1;
     C=Math.floor(date.AN/100);
     U=date.AN%100;
     N=date.AN%19;
     N=N+1;
     oar.CODE3=N;
     L=(C+2-U-Math.floor((U/4)))%7;/*document.form.trace.value=L;*/ 
     if (L<0) L=L+7;
     oar.CODE4=L;
     E=(11*(date.AN%19)+8)%30;
     oar.CODE5=E;
   }

function COMPUTG()
   { 
     S=(date.AN+8)%28;
     oar.CODE1=S+1;
     I=(date.AN+2)%15;
     oar.CODE2=I+1;
     C=Math.floor(date.AN/100);
     U=date.AN%100;
     N=date.AN%19;
     N=N+1;
     oar.CODE3=N;
     L=(2*C-Math.floor((C/4))-U-Math.floor((U/4)))%7;
     if (L<0) L=L+7;
     oar.CODE4=L;
     E=(11*(date.AN%19)+8-C+Math.floor((C/4))+Math.floor((8*C+13)/25))%30;
     /* Modification P. Rocher, le 11 février 2008 pour corrigé Epacte moins un en 1900 */
     if (E<0) E=E+30;
     oar.CODE6=E
    }

function PAQUES(form)
   {
lmoisg=new Array("null","janvier","février","mars","avril","mai","juin",
          "juillet","août","septembre","octobre","novembre","décembre");
ledom=new Array("A","B","C","D","E","F","G","A");
ljour=new Array("samedi","dimanche","lundi","mardi","mercredi", 
                "jeudi","vendredi");

Chaine=" "; Chauxi="";
if (date.AN>1582) PAQUESG(); else PAQUESJ();
document.form.DATPAQ.value="\r\n   dimanche "+ date.JOUR + " " + lmoisg[date.MOIS] + 
  " " + date.AN + "\r\n\r\n";
if (date.AN>1582) { /*affich paque orthodoxe et date en julien*/
 PAQUESJ();
document.form.DATPAQ.value=document.form.DATPAQ.value + "Pâque orthodoxe (" + 
 date.JOUR + " " + lmoisg[date.MOIS] + " " + date.AN;
JULIENJ(); JJDATE();
document.form.DATPAQ.value=document.form.DATPAQ.value + 
  " dans le calendrier julien) \r\n" + "dimanche " + date.JOUR + " " + 
  lmoisg[date.MOIS] + " " + date.AN + "\r\n\r\n";
             }
/*affich paque juive*/
date.MOIS=1; date.JOUR=1;
if (date.AN>1582) JULIEN(); else JULIENJ();
JISR();
if (date.TYPEA==1) date.MOIS=8; else date.MOIS=7;
date.JOUR=15;
document.form.DATPAQ.value=document.form.DATPAQ.value + "Pâque israelite (" + 
 date.JOUR + " " + "nissan" + " " + date.AN;
/*concord cal jul ou gre*/
ISRJ(); NOMJOUR(); JJDATE();
document.form.DATPAQ.value=document.form.DATPAQ.value + 
  " dans le calendrier israelite) \r\n" + ljour[oar.JSEM] + " " +
  date.JOUR + " " + 
  lmoisg[date.MOIS] + " " + date.AN + "\r\n";

/*comput*/
COMPUTJ();
BISJ();
if (date.TYPEA==0) Chauxi=ledom[oar.CODE4];
else Chauxi=ledom[oar.CODE4+1] + ledom[oar.CODE4];
if (date.AN<=1582) Chaine="";
else { COMPUTG(); BISG();
  Chaine="\r\nCOMPUT GREGORIEN\r\nlettre(s) dominicale(s) : ";
  if (date.TYPEA==0) Chaine=Chaine + ledom[oar.CODE4] + "\r\n";
  else Chaine=Chaine + ledom[oar.CODE4+1] + ledom[oar.CODE4] + "\r\n";
  if (oar.CODE6==25 && oar.CODE3>11) 
       Chaine=Chaine + "Epacte                  : " + "XXV\r\n";
  else Chaine=Chaine + "Epacte                  : " + oar.CODE6;
     }
document.form.COMPUT.value="Cycle solaire     : " + oar.CODE1 + "\r\n" +
    "Indiction romaine : " + oar.CODE2 + "\r\n" +
    "Nombre d'or       : " + oar.CODE3 + "\r\n" +
    "\r\nCOMPUT JULIEN\r\n" +
    "Lettre(s) dominicale(s) : " + Chauxi + "\r\n" +
    "Epacte                  : " </moiscODE5 + "\r\n" + Chaine; 

   }

 function suivan(form) {
date.AN=(form.nyear.value=="") ? "0" :eval(form.nyear.value);
date.AN++;
 if (date.AN<325 || date.AN>2500) {alert('hors limites');
                                       date.AN--; }
form.nyear.value=date.AN;
form.DATPAQ.value="";
PAQUES(form);
}

function preced(form) {
date.AN=(form.nyear.value=="") ? "0" :eval(form.nyear.value);
date.AN--;
 if (date.AN<325 || date.AN>2500) {alert('hors limites');
                                       date.AN++; }
form.nyear.value=date.AN; 
form.DATPAQ.value="";
PAQUES(form);
}

function couran(form) {
date.AN=(form.nyear.value=="") ? "0" :eval(form.nyear.value);
form.DATPAQ.value="";
 if (date.AN<325 || date.AN>2500) { alert('hors limites');
                                        return; }
PAQUES(form);
}

function dateinit(form) {
Todays=new Date();
/*selon les navigateurs la fonction getyear de Javascript
  donne 100 ou 2000 (avant 2000 donnait toujours le millésime*/

if (Todays.getYear() < 1000)
 document.form.nyear.value=1900 + Todays.getYear();
else 
 document.form.nyear.value=Todays.getYear();  

}