Wie alt bist du?

  Ralf Hersel   Lesezeit: 4 Minuten  🗪 17 Kommentare Auf Mastodon ansehen

Die Berechnung des Alters ist nicht trivial. Es gibt mehrere Lösungen, die sich voneinander unterscheiden.

wie alt bist du?

Keine Sorge, wir wollen nichts über die Altersstruktur unserer Leser:innen wissen. Es geht vielmehr um die Toten. In meinem Job habe ich es auch mit Beerdigungen zu tun. Bei einem Bestattungsauftrag der Stadt ist immer das Alter der verstorbenen Person angegeben, und zwar im Format Jahre, Monate, Tage. Ausserdem ist das Geburts- und Sterbedatum vermerkt. Die Altersangabe ist für Pfarrpersonen, die die Bestattung durchführen, von Interesse.

In unserer Kasualienverwaltung möchten wir das Alter nicht ungeprüft vom Bestattungsauftrag übernehmen, sondern selbst berechnen. Ich habe mich dieser Aufgabe angenommen und bin zu erstaunlichen Ergebnissen gekommen. Zuerst einmal habe ich das Alter in einer Tabellenkalkulation berechnet:

Die Formeln dafür sehen in LibreOffice Calc und Excel gleich aus:

  • Jahre = DATUMDIF(A2;B2;"Y")
  • Monate = DATUMDIF(A2;B2;"YM")
  • Tage = DATUMDIF(A2;B2;"MD")

Die beiden Tabellenkalkulationen liefern das gleiche Ergebnis, welches mit der Angabe auf dem Bestattungsauftrag übereinstimmt. So weit, so gut. Nun wollte ich das Alter in Python ausrechnen:

from datetime import date
from dateutil.relativedelta import relativedelta as delta

birth = date(1938, 4, 30)
death = date(2025, 3, 24)

age = delta(death, birth)

print(age.years, 'Jahre', age.months, 'Monate', age.days, 'Tage')

Erklärung: Das Modul datetime wird benötigt, um mit Datenobjekten umgehen zu können. Dateutil.relativedelta wird für die Differenzberechnung von Daten gebraucht. Dann erstelle ich die beiden Datenobjekte für Geburt und Tod. Anschliessend wird das relative Delta in der Variable age bereitgestellt. Die Ausgabe ist selbsterklärend. Das Ergebnis lautet:

86 Jahre 10 Monate 24 Tage

Die Jahre und Monate scheinen kein Problem zu sein, wohl aber die Tage. 22 ist nicht gleich 24.

Dann habe ich drei Webdienste bemüht:

Der https://www.calculator.net/age-calculator.html sagt: 24 Tage
Der https://www.gigacalculator.com/calculators/age-calculator.php sagt: 22 Tage
Der https://www.smart-rechner.de/altersrechner/rechner.php sagt: 23 Tage

Also, was denn nun? 22, 23 oder 24 Tage? Man kann das Alter auch von Hand ausrechnen. Da sich alle bei den Jahren und Monaten einig sind, konzentriere ich mich auf die Tage.

  • 1938 plus 86 Jahre ergibt 2024, und zwar im April
  • April 2024 plus 10 Monate ergibt Februar 2025
  • Von Ende Februar bis zum 24. März sind es 24 Tage

Fazit

Der Bestattungsauftrag, die Tabellenkalkulationen und der Gigacalculator meinen, dass es 22 Tage sind. Mein Python-Skript, die Handrechnung und Calculator.net stimmen für 24 Tage. Als Aussenseiter behauptet der Smart-Rechner, dass es 23 Tage sind. Ja, was denn jetzt?

Das Ganze riecht verdächtig nach dem Plus/Minus-Eins-Problem, mit dem wir es in der Informatik häufig zu tun haben. Dabei geht es darum, ob die Grenzwerte mitgezählt werden oder nicht.

Nun lasse ich euch und mich ratlos zurück. Vielleicht habt ihr eine Idee, wie man das Alter korrekt berechnet.

Titelbild: https://pixabay.com/photos/calendar-pay-number-year-date-2428560/

Quellen: im Text

Tags

Alter, Python, Excel, Rechnen, LibreOffice-Calc

Robert
Geschrieben von Robert am 3. April 2025 um 09:52

Witzige Beobachtung!

Ohne das jetzt überprüft zu haben, vermute ich, dass der Grund in der Monatsrechnung liegt.

Die Berechnung der Jahre ist klar, danach kann man die Monate aber unterschiedlich berechnen:

  1. Monate = (12 + Monat_Tod – Monat_Geburt) % 12, oder
  2. Tage_gesamt = Tage zwischen Datum_Tod und Datum_Geburt + Jahre, und dann Monate = Tage_gesamt // 30.

Würde das den Unterschied erklären?

Robert
Geschrieben von Robert am 3. April 2025 um 09:55

Und dann im 1. Fall: Tage = Tag_Tod – Tag_Geburt und im 2. Fall: Tage = Tage_gesamt % 30

Frank
Geschrieben von Frank am 3. April 2025 um 10:59

Eine Altersausssage auf Basis von Jahr, Monat und Tag ist GRUNDSÄTZLICH ungenau, weil Jahre und Monate nicht immer die gleiche Anzahl Tage haben. Je nach Jahr und Monat werden unterschiedlich viele Tage in diese Jahre und Maonate gesteckt und der Rest des Lebensalters bleibt dann für die Tage übrig.

Beispiele: Du lebst nur 30 Tage. Im Januar reicht das nicht für einen Monat. Im Februar sind das eine Monat und 2 Tage bzw. 1 Tag im Schaltjahr. oder Du lebst 366 Tage. Das kann genau ein Jahr oder aber ein Jahr und ein Tag sein.

Fazit: Altersangaben sind nur wirklich korrekt, wenn man das Alter in Tagen angibt, und dabei eine Programm verwendet, welches Schaltjahre richtig berücksichtigt.

Gruß Frank

Nick
Geschrieben von Nick am 3. April 2025 um 11:22

Vom ersten bis zum vierundzwanzigsten März sind es -fraglos- 24 Tage 😘️ - In "Februaren" gibt es aber mitunter 'Schalttage', die jedoch –in Deinem Fall, bzw. in dem des Verblichenen– für die Berechnung der Jahre und Monate nicht ins Gewicht fallen dürften.

Gefunden habe ich ferner übrigens einen 'Calendar Converter' in JS, wo neben den Maya Zählungen (und etlichen anderen) auch die ISO-8601 Erwähnung findet, und offenbar haben wir es beim 24.03.2025 zu tun gehabt mit ...

...Day 4 of week 17 of year 2025 (die Formulierung ist nicht der Standard, sondern dem Calculator geschuldet).

s.a.: https://www.fourmilab.ch/documents/calendar/

Nick
Geschrieben von Nick am 3. April 2025 um 11:29

...MEIN Fehler, weil ich idiotischerweise abgerutscht war und es für APRIL anstatt März berechnet hatte. Mit dem Calculator ist also alles in bester Ordnung.

Calculus
Geschrieben von Calculus am 3. April 2025 um 11:29

Ich denke, dass die Grenzwerte hier mitzuzählen sind. Denn das Sterbedatum ist ja nicht der erste Tag, der nicht mehr miterlebt wurde, sondern der letzte, der miterlebt wurde (wenn auch nicht komplett). Fall Vollzähligkeit eine Rolle spielt müsste weiter nach Stunden, Minuten, usw aufgedröselt werden. Sonst hätte jemand, der am Tag nach seiner Geburt stirbt nämlich 0 Tage gelebt.

ubu
Geschrieben von ubu am 3. April 2025 um 13:16

Schaltjahre nicht vergessen ;) Alle 100 Jahre ist kein Schaltjahr, alle 400 Jahre aber schon 1800 war kein Schaltjahr, 1900 auch keines, aber 2000 schon

David
Geschrieben von David am 3. April 2025 um 14:46

Jahr ist an sich schon eine unsaubere Einheit. Ein Schaltjahr hat 366 Tage. Bei den Monaten ähnlich. Je nachdem, was man unter einem Jahr/Monat versteht, wird man zu unterschiedlichen Ergebnissen kommen.
Beim age-Calculator steht auch ein entsprechender Hinweis dabei:

"In some situations, the months and day result of this age calculator may be confusing, especially when the starting date is the end of a month. For example, we count Feb. 20 to Mar. 20 to be one month. However, there are two ways to calculate the age from Feb. 28, 2022 to Mar. 31, 2022. If we consider Feb. 28 to Mar. 28 to be one month, then the result is one month and 3 days. If we consider both Feb. 28 and Mar. 31 as the end of the month, then the result is one month. Both calculation results are reasonable. Similar situations exist for dates like Apr. 30 to May 31, May 30 to June 30, etc. The confusion comes from the uneven number of days in different months. In our calculations, we use the former method."

Bei der Ausrechnen würde ich eher den angebrochenen Monat bis zum 1. des folgenden Monats mit Tagen auffüllen. Denn was sollte 30.4.+10 Monate bedeuten? Das wäre sonst 30. Februar, da der Februar in einem Nichtschaltjahr 28 Tage hat käme man effektiv beim 2. März heraus und dann sind es bis zum 24. März nur noch 22 Tage.

Also eher so: 30.4. + 1 Tag = 1. Mai ; 1. Mai + 10 Monate = 1. März des folgenden Jahres ; 1. März + 23 Tage = 24. März

Also würde ich bei 86 Jahre, 10 Monate, 23 Tage herauskommen. Jemand der irgendwie mit mittleren Monaten und Jahren rechnet könnte auch ein anderes Ergebnis haben.

Der Tag könnte auch schon durch Rundungsfehler falsch sein. Ist jemand um 18 Uhr geboren und um 6 Uhr in der Frühe gestorben ist es auch schon ein halber Tag weniger .

David
Geschrieben von David am 3. April 2025 um 23:52

Ich geh unten unter dem zweiten Punkt noch einmal auf mein eigenes voheriges Posting ein.

Punkt 1) Ich habe Man hat bei solchen Rechnungen ein latentes "plus minus eins" Problem mit dem üblichen Sprachgebrauch. Etwa z.B.

Sprachlich 1. Februar plus ein Monat ist der 1. März. Der Zeitraum 1.2. - 1.3. ist aber der ganze Februar plus einen Tag, weil der 1.2. um 0 Uhr beginnt und der 1.3. bis zur Vollendung der letzten Minute um 23.59 Uhr endet.

Punkt 2) Betrachtet man den Zeitraum 15.1.-16.4. eines Jahres. So hat man 16 Tage im Januar, den gesamten Februar und den gesamten März und 16 Tage im April. Man kommt auf zwei Monate und 32 Tage. Die 32 Tage kann man aber nicht richtig einem der angebrochenen Monate (Januar oder April) zuordnen. Der Januar hätte 31 Tage der April aber 30. Wenn man zuordnen würde es recht willkürlich und je nach Zuordnung hätte man dann das Ergebnis: drei Monate und einen Tag oder auch drei Monate und zwei Tage. Landläufig würde beim Blick auf 15.1.-16.4. sagen, drei Monate und ein Tag.

Aber was wäre nun das Ergebnis (ein paar Tage verschoben) in einem Nichtschaltjahr von 31.1. plus drei Monate und einen Tag:

Rechenweg 1) Man könnte zuerst den 31.1. + 1 Tag = 1.2. und dann die 3 Monate dem 1.2. hinzufügen ... Ergebnis 1.5. Rechenweg 2) Man ginge zurück auf den 28.1. Die Idee dabei der 28. kommt in allen Monaten vor, man kann die folgende Addition der Monate sieht scheinbar widerspruchsfrei ausführen; addiert dann also 3 Monate = 28.4. (Zwischenergebnis) und dann die verbleibenden (also die drei zuvor abgezogenen und den einen Tag) 3+1 = 4 Tage ... Ergebnis wäre dann der 2.5.

Nick
Geschrieben von Nick am 4. April 2025 um 07:51

...Doch, das Auffüllen mit Tagen geht – FROHE OSTERN!

Der Ostersonntag ist der erste Sonntag nach dem ersten Vollmond im Frühling (festgesetzter Frühlingsanfang und frühester Frühlingsvollmond: 21. März). Der damit frühestmögliche Termin für den Ostersonntag ist der 22. März, der spätestmögliche der 25. April.

X:=2025;
K:= X div 100;
M:= 15 + ((3*K + 3) div 4) - ((8*K + 13) div 25);
S:= 2 - ((3*K + 3) div 4);
A:= X mod 19;
F:= (19*A + M) mod 30;
R:= (F + A div 11) div 29;
OG:= 21 + F - R;
SZ:= 7 - (X + (X div 4) + S) mod 7;
OE:= 7 - (OG - SZ) mod 7;
OSM:= OG + OE;
OSA:= OSM-31;
[OSM,OSA]

Ergebnis: [44, 13] Also wäre für 2025 in den Westkirchen der Ostersonntag der "44. März", bzw. der 13. April. 2025 – zumindest, wenn ich richtig gerechnet habe ;) - ...Wikipedia behauptet jedoch, es sei 1W später!!!

PS: Die Formel lag -bislang- noch nie falsch. Also ggf. bitte selber nachrechnen. GNU when hat ebenfalls den 20.04.2025:

$ when y
Fr 2025 Apr  4   7:40
... 
So        2025 Apr 20 Ostersonntag (+ Karfreitag + Ostermontag)

PPS: "In vielen Ostkirchen werden weiterhin der nicht-reformierte julianische Kalender und die nicht-reformierte Datierung des Osterfestes verwendet."

Herr_Dyyhl
Geschrieben von Herr_Dyyhl am 3. April 2025 um 17:30

Ich tippe ebenfalls auf das Problem Schaltjahre. Vielleicht wird es im Ganzen/Mittel genauer, wenn man die durchschnittliche Länge eines Jahres des gregorianischen Kalender anwendet (365,2425 Tage).

Stefan
Geschrieben von Stefan am 3. April 2025 um 21:40

Nach deutschem Zivilrecht ist Deine Rechnung zweifelsfrei die richtige (Rechtsgedanke des § 189 II BGB).

Phil
Geschrieben von Phil am 4. April 2025 um 08:19

dateutils.ddiff 1938-04-30 2025-03-25 -f '%y %m %d'

86 10 23

tuxnix
Geschrieben von tuxnix am 4. April 2025 um 09:35

Ich hab mal ein bash skript geschrieben, dass die unterschiedlichen Rechenwege ganz gut aufzeigen dürfte.

Zuerst wird astronomisch gerechnet: Die Differenz der Tage wird bestimmt und danach die Anzahl der Jahre ausgerechnet. Ein Jahr hat 365,242198 Tage (so in etwa). Aus dem Rest von Tage/365,2... die Monate und...die Tage.

Der zweite Weg geht kalendarisch. Das ist im Prinzip so, als wenn man im Kalender die Jahre, die Monate und die Tage abzählt. Und dabei muss man dann aufpassen weil die Monate unterschiedlich viele Tage haben. Der Befehl date kennt den Kalender und ich habe eine Funktion eingebaut die vom ersten Tag des Monats 1. Sekunde abzieht, damit der letzte Tag des Vormonats ausgegeben wird.

Das Skript gibt beide Ergebnisse aus, damit man sie vergleichen kann. Ich denke mal, dass die kalendarische Ausgabe das ist was man eigentlich haben möchte. Angenommen der Geburtstag war am 31.03.1938 und der Mensch ist am 31.03.2025 verstorben, dann möchte man bestimmt sagen: Er ist 87 Jahre alt geworden. Die astronomische Berechnung wäre bei diesen Daten aber nur: 86 Jahre, 11 Monate und 30 Tage mit 0.36 Tage Rest

Jetzt hoffe ich nur noch, dass ich nicht irgendwo ein + oder - vertauscht habe und falls doch, dann hoffe ich auf die Verbesserung ;) das Kniffeln hat jedenfalls Spaß gemacht.

!/usr/bin/bash

Geburtstag

byear=1938 bmonth=03 bday=31

Sterbetag

dyear=2025 dmonth=03 dday=31

Als Datum

death="$dyear-$dmonth-$dday" birth="$byear-$bmonth-$bday"

------ astronomisch ----

In Tagen

death=$(( $(date --date=$death +%s)/86400 )) birth=$(( $(date --date=$birth +%s)/86400 ))

if [ $death -lt $birth ]; then echo "Falscheingabe! - Vor der Geburt verstorben" exit fi

Differen in Tagen

days=$(( $death-$birth )) years=$(($days1000000/365242198)) mRest=$(($days1000000 % 365242198)) mFaktor=$((365242198/12)) month=$(($mRest/$mFaktor)) days=$((($mRest % $mFaktor)/1000000)) Rest=$((($mRest % $mFaktor)/10000-$days*100))

echo "astronomisch: $years Jahr(e), $month Monat(e) und $days Tag(e) 0.$Rest Rest"

---- kalendarisch -----

days() { lastsec=$(( date -d ${dyear}${dmonth}01 +%s -1)) lastday=$(echo $lastsec | awk '{print strftime("%d",$1)}' ) lastmonth=$(echo $lastsec | awk '{print strftime("%b",$1)}' ) echo "$lastmonth $lastday" days=$(($lastday-$bday+$dday)) }

if [ $dday -ge $bday ] && [ $dmonth -ge $bmonth ]; then years=$(($dyear-$byear)) months=$(($dmonth-$bmonth)) days=$(($dday-$bday))

elif [ $dday -ge $bday ] && [ $dmonth -lt $bmonth ]; then years=$(($dyear-$byear-1)) months=$(($dmonth-$bmonth+12)) days=$(($dday-$bday))

elif [ "$dday" -lt "$bday" ] && [ "$dmonth" -gt "$bmonth" ]; then years=$(($dyear-$byear)) months=$(($dmonth-$bmonth-1)) days

elif [ "$dday" -lt "$bday" ] && [ "$dmonth" -eq "$bmonth" ]; then years=$(($dyear-$byear-1)) months=11 days

elif [ "$dday" -lt "$bday" ] && [ "$dmonth" -lt "$bmonth" ]; then years=$(($dyear-$byear-1)) months=$(($dmonth-$bmonth+11)) days fi

echo "kalendarisch: $years Jahr(e), $months Monat(e) und $days Tag(e)"

Walter
Geschrieben von Walter am 5. April 2025 um 12:42

ES gibt einen neuen Ansatz, um das +-1-Problem ein für alle Mal zu lösen:

https://xkcd.com/3062/

;-)

andreas
Geschrieben von andreas am 7. April 2025 um 11:07

interessant...ich bin prinzipiell dafür, dass nur gerade, letzte Lebenstage gültig sind, da ungerade Tage oft nicht gerade lebenswert und damit als letzer Lebenstag als nicht gerade geeignet erscheinen müssen. LG^^