Pojawiło się to podczas date -d "$death_date - $y years - $m months - $d days"
uzyskiwania daty urodzenia (dla genealogii). To polecenie jest NIEPRAWIDŁOWE. Miesiące nie są jednakowej długości, więc (date + offset) - offset != date
. Wiek, w roku / miesiącu / dniu, jest miarą naprzód od daty urodzenia.
$ 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)
Data daje poprawny wynik w obu przypadkach, ale w drugim przypadku zadałeś niewłaściwe pytanie. Ma znaczenie, KTÓRE 11 miesięcy w roku pokrywa +/- 11, przed dodaniem / odjęciem dni. Na przykład:
$ 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
Aby odjęcie było odwrotną operacją dodawania, kolejność operacji musiałaby zostać odwrócona. Dodanie dodaje lata, NASTĘPNIE miesiące, NASTĘPNIE dni. Jeśli odejmujesz w odwrotnej kolejności, wrócisz do punktu początkowego. Nie zmienia się, więc nie, jeśli przesunięcie dni przekracza granicę miesiąca w innym miesiącu długości.
Jeśli musisz cofnąć się od daty i wieku zakończenia, możesz to zrobić za pomocą wielu wywołań date
. Najpierw odejmij dni, potem miesiące, a potem lata. (Nie sądzę, że łączenie lat i miesięcy w jednym date
wywołaniu jest bezpieczne, ponieważ lata przestępne zmieniają długość lutego).