Это возникло при использовании, date -d "$death_date - $y years - $m months - $d days"
чтобы получить дату рождения (для генеалогии). Эта команда НЕПРАВИЛЬНА. Месяцы не имеют одинаковую длину, поэтому (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
вызове, потому что високосные годы меняют продолжительность февраля.)