Cela s'est produit lors de l'utilisation date -d "$death_date - $y years - $m months - $d days"
d'une date de naissance (pour la généalogie). Cette commande est FAUX. Les mois ne sont pas tous de la même longueur, donc (date + offset) - offset != date
. Les âges, en année / mois / jour, sont des mesures allant de la date de naissance.
$ 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)
Date donne la sortie correcte dans les deux cas, mais dans le second cas, vous posiez la mauvaise question. Quel que soit 11 mois de l’année la couverture +/- 11, avant d’additionner / soustraire des jours. Par exemple:
$ 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
Pour que la soustraction soit l’opération inverse d’ajout, il faudrait inverser l’ordre des opérations. L'ajout ajoute des années, PUIS des mois, PUIS des jours. Si la soustraction utilisait l'ordre inverse, vous reviendriez à votre point de départ. Ce n'est pas le cas, donc vous ne le faites pas, si le décalage des jours dépasse une limite de mois dans un mois de longueur différente.
Si vous devez travailler en arrière à partir d'une date et d'un âge de fin, vous pouvez le faire avec plusieurs invocations de date
. Commencez par soustraire les jours, puis les mois, puis les années. (Je ne pense pas qu'il soit prudent de combiner les années et les mois en une seule date
invocation, car les années bissextiles modifient la durée de février.)