Code du jour: Une brève histoire de date (T)

Publié le 22 avril 2008 par Wtf

Algirdas Kepezinskas était en train de débugger du code d'un client lorsqu’il trouva l'un des plus merveilleux algorithmes de manipulation de date. J'ai enlevé le nom de la fonction, et je vous laisserai comme exercice, d'essayer de trouver ce que ce gros tas d'arithmétique fait ...

private int ?????? (Date date1, Date date2)
{
int retval = 0;
if (date1 > date2) return 0;
int d1 = date1.Year * 10000 + date1.Month * 100 + date1.Day;
int d2 = date2.Year * 10000 + date2.Month * 100 + date2.Day;
int dat = d1 / 100;
int a = 0, d = 0;
while ((dat <= (d2 / 100)) & (a < 12))
{
int daymo = 31;
if (dat/100 == 2) if ((dat%100 %4)==0) daymo -= 2; else daymo -= 3;
if ((dat/100 % 2)==(dat/100 / 8)) daymo -= 1;
if ((d1/100 == dat) || (d2/100 == dat))
{
if (d1/100 == dat) d = daymo - (d1%100)+1;
if (d2/100 == dat)
{
if (d1/100 == d2/100) d -= daymo - d2%100;
else d = d2%100;
}
}
else d = daymo;
retval += d;
if (dat%100 == 12) dat = (dat/100 + 1)*100 + 1;
else dat += 1;
a +=1;
}
return retval;
}

On abandonne déjà? Je vous donne un indice : la seule ligne de code avec laquelle Algirdas remplaça la fonction ...

return (date1 - date2);