1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| int Gregorien_To_JJ(int angreg,int moisgreg,int jourgreg)
{
// Cette fonction donne la partie entière du jour julien à 0H00 du jour indiqué par
// la date grégorienne jourgreg/moisgreg/angreg
// Contraintes : angreg est le quantième de l'année : entre -4700 environ et +10000
// moisgreg est le numéro du mois 1 - pour janvier,..., 12 pour décembre
// jourgreg est le quantième du jour dans le mois : entre 1 et 31
//
// Cette fonction ne vérifie pas la validité de la date (en particulier le nombre de jours du mois)
// Elle donnera le même résultat pour le 32/01/2005 que la date 01/02/2005
// En prime si JJ désigne le résultat de cette fonction,
// (jj+2) modulo 7 donne le jour de la semaine (0 pour dimanche, 6 pour samedi)
// Pour la date du 31/03/2005 on obtient le résultat jj=2453460 et (jj+2) modulo 7 = 4 (jeudi)
//
// Le point important est la division entière (153*moisgreg-457)/5
// C'est le démarrage de l'année au 1er Mars qui permet de calculer en une seule
// division entière un décalage en nombre de jours dû au quantième du mois, en
// s'affranchissant de l'irrégularité du mois de février, mois maudit des romains,
// et des informaticiens...
//
int alfa,beta,gamma,mu,nu,delta,eta,result;
// AB est mon année de référence, la constante JJO est la partie entière du jour julien
// du 1er Mars 2000. S'il ne s'agit que de calculer des différences de dates, JJO ne
// sert à rien on peut la supprimer ici et dans le calcul ci-dessous
int AB=2000;
int JJO=2451604;
// Je fais démarrer l'année au 1-er mars, pour des raisons arithmétiques
// ... et historiques
// 25/12/2004 reste 25/12/2004
// mais 3/01/2005 devient 3/13/2004
// et 14/02/2005 devient 14/14/2004
if (moisgreg<3)
{
moisgreg+=12;
angreg--;
}
alfa=angreg-AB;
// Dans la division suivante, j'ai ajouté 400000 avant de diviser par 400
// en otant 1000 ensuite, pour garantir que le dividende soit toujours
// positif.
beta=(alfa+400000)/400-1000;
// 146097 jours = 4 siècles grégoriens
gamma=(alfa+400000)%400; // Il y a beta groupes de 146097 jours + gamma années
// 36524 jours = un petit siècle grégorien (les grands font 36525 jours)
delta=gamma/100; // Il y a delta siecles de 36524 jours plus eta années dans le siecle
eta=gamma%100;
mu=eta/4;
nu=eta%4; // Il y a mu groupes de 4 années (1461 jours) et nu années
// ordinaires (365 jours)
result=((153*moisgreg-457)/5+jourgreg-1+nu*365+mu*1461+delta*36524+beta*146097+JJO);
return result;
} |
Partager