Für Berechnungen mit Datumsangaben setze ich üblicherweise auf Date::Calc. Es bekommt zwei Array aus je drei Werten (Jahr, Monat, Tag) als Parameter und liefert die Differenz ebenfalls als Array. Nun würde ich damit gerne berechnen, wie alt jemand ist. Da jemand, der 29 Jahre, 4 Monate und 15 Tage alt ist, effektiv nun mal einfach 29 ist, empfehlen entsprechenderweise auch etliche Foreneinträge, für die Berechnung des Alters doch einfach Delta_YMD zu benutzen und nur die Angabe der Jahre zu verwenden. Auf geht’s:
my @age = Delta_YMD( 1978, 12, 17, 2008, 04, 02 );
print join( ", ", @age ) . "\n";
Das Ergebnis überrascht:
30, -8, -15
Für Date::Calc bin ich also bereits über die Bioklippe gesprungen, obwohl es bis dahin noch mehrere Monate sind. Dafür wird ein interessantes Konzept negativer Monate und Tage eingesetzt. Na dankeschön, aus den jeweils drei Werten eines Array einfach dreimal die Differenz zu bilden, hätte ich auch ohne extra Modul hinbekommen.
Eine kurze Recherche im Netz brachte dann diesen Wrapper für Delta_YMD() zutage, mit dem sich das Problem lösen lässt. Vielleicht könnte auch das (nicht offiziell in CPAN enthaltene) Date::Calc::Age helfen. Hab’s aber noch nicht getestet.