Ciò è emerso quando si utilizzava date -d "$death_date - $y years - $m months - $d days"
per ottenere una data di nascita (per la genealogia). Questo comando è SBAGLIATO. I mesi non sono tutti della stessa durata, quindi (date + offset) - offset != date
. Le età, in anno / mese / giorno, sono misure che vanno avanti dalla data di nascita.
$ 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 data fornisce l'output corretto in entrambi i casi, ma nel secondo caso stavi facendo la domanda sbagliata. È importante QUANTO 11 mesi all'anno la copertina di +/- 11, prima di aggiungere / sottrarre giorni. Per esempio:
$ 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
Affinché la sottrazione sia l'operazione inversa dell'aggiunta, l'ordine delle operazioni dovrebbe essere invertito. L'aggiunta aggiunge anni, POI mesi, POI giorni. Se la sottrazione usasse l'ordine opposto, torneresti al punto di partenza. Non lo è, quindi non lo fai, se l'offset dei giorni attraversa il limite di un mese in un mese di diversa lunghezza.
Se devi lavorare a ritroso a partire da una data e un'età di fine, puoi farlo con più invocazioni di date
. Prima sottrai i giorni, poi i mesi, poi gli anni. (Non penso che sia sicuro combinare anni e mesi in un'unica date
invocazione, a causa degli anni bisestili che alterano la lunghezza di febbraio.)