Ini muncul ketika menggunakan date -d "$death_date - $y years - $m months - $d days"
untuk mendapatkan tanggal lahir (untuk silsilah). Perintah itu SALAH. Bulan tidak semuanya sama, jadi (date + offset) - offset != date
. Usia, dalam tahun / bulan / hari, adalah langkah maju dari tanggal lahir.
$ 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 memberikan output yang benar dalam kedua kasus, tetapi dalam kasus kedua Anda menanyakan pertanyaan yang salah. Itu penting YANG 11 bulan dalam setahun dari penutup +/- 11, sebelum menambah / mengurangi hari. Sebagai contoh:
$ 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
Untuk mengurangi menjadi operasi terbalik dari penambahan, urutan operasi harus dibalik. Menambahkan menambahkan tahun, MAKA bulan, MAKA hari. Jika mengurangi menggunakan urutan yang berlawanan, maka Anda akan kembali ke titik awal Anda. Tidak, jadi Anda tidak, jika hari offset melintasi batas bulan di bulan panjang yang berbeda.
Jika Anda perlu bekerja mundur dari tanggal dan usia akhir, Anda dapat melakukannya dengan beberapa pemanggilan date
. Pertama kurangi hari, lalu bulan, lalu tahun. (Saya pikir tidak aman untuk menggabungkan tahun dan bulan dalam satu date
doa tunggal , karena tahun kabisat mengubah panjang Februari.)