Beachten Sie zuerst die Annahme, dass, wenn Sie zum Beispiel am 1. Februar, dann am folgenden 1. März geboren wurden, Sie genau 1 Monat alt sind, obwohl Ihr Alter in Tagen nur 28 - weniger als die Länge ist eines durchschnittlichen Monats. Die Jahre haben auch eine variable Länge (aufgrund von Schaltjahren), was bedeutet, dass Ihr Alter an Ihrem Geburtstag in der Regel keine exakte ganze Zahl von Jahren ist. Wenn Sie die genaue Zeit, in der Sie in Jahren/Monaten/Tagen gelebt haben, ausdrücken möchten, sehen Sie sich meine andere Antwort an. Aber wahrscheinlicher ist es, dass Sie es richtig korrigieren, so dass die Geburt am 1. Februar bedeutet, dass Sie am 1. Februar X Jahre, 0 Monate und 0 Tage alt sind und am 1. eines Monats X Jahre, Y Monate, und 0 Tage.
In diesem Fall lesen Sie weiter. (NB: die folgenden funktioniert nur für Termine in der Vergangenheit.)
ein Geburtsdatum gegeben, (y,m,d)
, das aktuelle Datum, (ynow,mnow,dnow)
und eine Funktion die unix/epoch time for a given date, die folgende ausgeben wird ein 3-Element geben Liste gibt Alter als {Jahre, Monate, Tage}:
t0 = y*12 + m - 1; # total months for birthdate.
t = ynow*12 + mnow - 1; # total months for Now.
dm = t - t0; # delta months.
if(dnow >= d) return [floor(dm/12), mod(dm,12), dnow-d];
dm--; t--;
return [floor(dm/12), mod(dm,12),
(tm({ynow,mnow,dnow}) - tm({floor(t/12), mod(t,12)+1, d}))/60/60/24];
Es folgt ein Äquivalent Algorithmus, wenn Sie nicht alle mögen die Böden und Mods. Aber ich denke, das obige ist besser. Zum einen vermeidet es den Aufruf von , wenn es nicht nötig ist.
{yl, ml} = {ynow, mnow};
if(mnow < m || mnow == m && dnow < d) yl--;
if(dnow < d) ml--;
years = yl - y;
months = ml + 12*(ynow - yl) - m;
yl = ynow;
if(ml == 0) { ml = 12; yl--; }
days = (tm({ynow, mnow, dnow}) - tm({yl, ml, d}))/60/60/24;
return [years, months, days];
Viele Sprachen können dies in ihren Standardbibliotheken tun. Irgendeine bevorzugte Sprache oder willst du einen "reinen" Algorithmus? –
Werfen Sie einen Blick auf diesen Artikel: http://00f.net/2007/an-age-is-not-a-duration – MatthieuP
Ähnlich wie http://stackoverflow.com/questions/9/how-do-i- calculate-someones-age-in-c – some