Це з’явилося під час використання date -d "$death_date - $y years - $m months - $d days"
дати народження (для генеалогії). Ця команда WRONG. Місяці не всі однакові, так що (date + offset) - offset != date
. Вік у році / місяць / день - це заходи, що рухаються вперед від дати народження.
$ 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)
Дата дає правильний результат в обох випадках, але у другому випадку ви задали неправильне запитання. Має значення, ЯК 11 місяців року покриває +/- 11, перед додаванням / відніманням днів. Наприклад:
$ 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
Щоб віднімання було зворотною операцією додавання, порядок операцій потрібно було б змінити. Додавання додає років, ТОЗ місяців, ТОГО днів. Якщо віднімання використовувало протилежний порядок, то ви повернетесь до початкової точки. Це не так, тож ви цього не зробите, якщо зміщення днів перетинає місячну межу в інший місяць тривалості.
Якщо вам потрібно працювати назад від дати закінчення та віку, ви можете зробити це за допомогою декількох викликів date
. Спочатку віднімайте дні, потім місяці, потім роки. (Я не думаю, що поєднувати роки та місяці в одній date
виклику не можна, бо високосні роки, що змінюють тривалість лютого.)