Isso surgiu ao usar date -d "$death_date - $y years - $m months - $d days"
para obter uma data de nascimento (para genealogia). Esse comando está errado. Meses não têm a mesma duração, então (date + offset) - offset != date
. As idades, em ano / mês / dia, são medidas que avançam a partir da data de nascimento.
$ 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)
A data fornece a saída correta nos dois casos, mas no segundo caso, você estava fazendo a pergunta errada. É importante QUAIS 11 meses do ano a cobertura +/- 11, antes de adicionar / subtrair dias. Por exemplo:
$ 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
Para subtrair a operação inversa da adição, a ordem das operações teria que ser revertida. Adicionar adiciona anos, ENTÃO meses, ENTÃO dias. Se subtrair usasse a ordem oposta, você retornaria ao seu ponto de partida. Não, se não, se o deslocamento dos dias ultrapassar o limite do mês em um mês diferente.
Se você precisar trabalhar de trás para frente a partir de uma data e idade de término, poderá fazê-lo com várias invocações de date
. Primeiro subtraia os dias, depois os meses e depois os anos. (Não acho seguro combinar os anos e os meses em uma única date
invocação, por causa dos anos bissextos que alteram a duração de fevereiro.)