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
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:
Würde das den Unterschied erklären?
Und dann im 1. Fall: Tage = Tag_Tod – Tag_Geburt und im 2. Fall: Tage = Tage_gesamt % 30
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
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/
...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.
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.
https://www.wolframalpha.com/input?i=days+from+30.04.1938+to+24.03.2025
;-)
Schaltjahre nicht vergessen ;) Alle 100 Jahre ist kein Schaltjahr, alle 400 Jahre aber schon 1800 war kein Schaltjahr, 1900 auch keines, aber 2000 schon
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 .
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.
...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.
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:PPS: "In vielen Ostkirchen werden weiterhin der nicht-reformierte julianische Kalender und die nicht-reformierte Datierung des Osterfestes verwendet."
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).
Nach deutschem Zivilrecht ist Deine Rechnung zweifelsfrei die richtige (Rechtsgedanke des § 189 II BGB).
dateutils.ddiff 1938-04-30 2025-03-25 -f '%y %m %d'
86 10 23
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)"
ES gibt einen neuen Ansatz, um das +-1-Problem ein für alle Mal zu lösen:
https://xkcd.com/3062/
;-)
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^^