Bu date -d "$death_date - $y years - $m months - $d days"
doğum tarihini almak için kullanıldığında (şecere için) ortaya çıktı. Bu komut YANLIŞ. Aylar hepsi aynı uzunlukta değil (date + offset) - offset != date
. Yaş, yıl / ay / gün olarak, doğum tarihinden itibaren ileri giden önlemlerdir.
$ 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)
Tarih her iki durumda da doğru çıktı veriyor, ancak ikinci durumda yanlış soruyu soruyordunuz. WHICH'in yılın 11 ayı ile +/- 11'in kapattığı günler eklenir / çıkarılır. Örneğin:
$ 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
Çıkarma işleminin ters işlem yapması için işlem sırasının tersine çevrilmesi gerekir. Yıllar, THEN aylar, THEN günler ekler. Çıkarma işlemi ters siparişi kullandıysa, başlangıç noktanıza dönersiniz. Öyle değil, bu yüzden değil, eğer gün ofseti farklı bir aydaki bir ay sınırını geçerse.
Bir bitiş tarihi ve yaşından itibaren geriye doğru çalışmanız gerekiyorsa, bunu birden fazla çağrı ile yapabilirsiniz date
. İlk önce günleri, sonra ayları, sonra yılları çıkarın. ( date
Yılları ve ayları, şubatın uzunluğunu değiştiren artık yıllar nedeniyle tek bir başvuruda birleştirmenin güvenli olduğunu sanmıyorum .)