Dies trat auf, als verwendet wurde date -d "$death_date - $y years - $m months - $d days"
, um ein Geburtsdatum zu erhalten (für Genealogie). Dieser Befehl ist FALSCH. Monate sind also nicht alle gleich lang (date + offset) - offset != date
. Das Alter in Jahr / Monat / Tag ist ein Maß, das vom Geburtsdatum an voranschreitet.
$ date --utc -d 'mar 28 1867 +72years +11months +2days'
Fri Mar 1 00:00:00 UTC 1940
$ date --utc -d 'mar 1 1940 -72years -11months -2days'
Sat Mar 30 00:00:00 UTC 1867
# (2 days later than our starting point)
Das Datum gibt in beiden Fällen die richtige Ausgabe aus, aber im zweiten Fall haben Sie die falsche Frage gestellt. Es ist wichtig, WELCHE 11 Monate im Jahr +/- 11 umfassen, bevor Tage addiert / subtrahiert werden. Zum Beispiel:
$ date --utc -d 'mar 31 1939 -1month'
Fri Mar 3 00:00:00 UTC 1939
$ date --utc -d 'mar 31 1940 -1month' # leap year
Sat Mar 2 00:00:00 UTC 1940
$ date --utc -d 'jan 31 1940 +1month' # leap year
Sat Mar 2 00:00:00 UTC 1940
Damit das Subtrahieren die inverse Operation des Addierens ist, müsste die Reihenfolge der Operationen umgekehrt werden. Durch Hinzufügen werden Jahre, DANN Monate, DANN Tage hinzugefügt. Wenn Sie die umgekehrte Reihenfolge beim Subtrahieren verwenden, kehren Sie zum Ausgangspunkt zurück. Dies ist nicht der Fall, und Sie tun es auch nicht, wenn der Tagversatz eine Monatsgrenze in einem Monat mit einer anderen Länge überschreitet.
Wenn Sie ab einem Enddatum und Alter rückwärts arbeiten müssen, können Sie dies mit mehreren Aufrufen von tun date
. Subtrahieren Sie zuerst die Tage, dann die Monate und dann die Jahre. (Ich denke nicht, dass es sicher ist, die Jahre und Monate in einem einzigen date
Aufruf zu kombinieren , da Schaltjahre die Länge des Februar verändern.)