Esto surgió cuando se usa date -d "$death_date - $y years - $m months - $d days"
para obtener una fecha de nacimiento (para genealogía). Ese comando es INCORRECTO. Meses no son todos de la misma longitud, por lo que (date + offset) - offset != date
. Las edades, en año / mes / día, son medidas que van desde la fecha de nacimiento.
$ 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)
La fecha da el resultado correcto en ambos casos, pero en el segundo caso estaba haciendo la pregunta incorrecta. Importa QUÉ 11 meses del año cubren +/- 11, antes de sumar / restar días. Por ejemplo:
$ 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 que la resta sea la operación inversa de sumar, el orden de las operaciones debería invertirse. Agregar agrega años, ENTONCES meses, ENTONCES días. Si restar usa el orden opuesto, entonces volverías a tu punto de partida. No lo hace, por lo que no lo hace, si el desplazamiento de días cruza el límite de un mes en un mes de duración diferente.
Si necesita trabajar hacia atrás desde una fecha y edad de finalización, puede hacerlo con múltiples invocaciones de date
. Primero reste los días, luego los meses, luego los años. (No creo que sea seguro combinar los años y los meses en una sola date
invocación, debido a que los años bisiestos alteran la duración de febrero).