Điều này xuất hiện khi sử dụng date -d "$death_date - $y years - $m months - $d days"
để có được ngày sinh (đối với phả hệ). Lệnh đó là SAI. Tháng không phải là tất cả cùng một chiều dài, vì vậy (date + offset) - offset != date
. Lứa tuổi, tính theo năm / tháng / ngày, là các biện pháp chuyển tiếp kể từ ngày sinh.
$ 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)
Ngày cung cấp đầu ra chính xác trong cả hai trường hợp, nhưng trong trường hợp thứ hai, bạn đã hỏi sai câu hỏi. Vấn đề là 11 tháng trong năm, bao gồm +/- 11, trước khi cộng / trừ ngày. Ví dụ:
$ 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
Để trừ đi là hoạt động nghịch đảo của việc thêm, thứ tự các hoạt động sẽ phải được đảo ngược. Thêm năm, THEN tháng, THEN ngày. Nếu phép trừ được sử dụng theo thứ tự ngược lại, thì bạn sẽ quay trở lại điểm xuất phát của mình. Không, vì vậy bạn không, nếu ngày bù vượt qua ranh giới tháng trong một tháng có độ dài khác nhau.
Nếu bạn cần phải làm việc ngược từ ngày kết thúc và tuổi, bạn có thể làm điều đó với nhiều yêu cầu date
. Đầu tiên trừ đi ngày, rồi tháng, rồi năm. (Tôi không nghĩ sẽ an toàn khi kết hợp năm và tháng trong một lần date
gọi, vì năm nhuận thay đổi độ dài của tháng hai.)