쉘 스크립트에서 "1000일"과 같은 형식을 "2년, 9개월, 0일"과 같은 형식으로 변환하는 "간단하게 유지"하는 방법은 무엇입니까?
모듈러스나 바닥 반올림을 적용하는 것을 고려했습니다. 비슷한 문제를 살펴봤지만 "짧은" 방향으로 가는 대신 모든 것을 필요 이상으로 복잡하게 만드는 추가 요구 사항이 있습니다.
답변1
그리고 dateutils
:
$ today=$(dseq -f %F now)
$ ddiff -f '%y years, %m months and %d days' "$today" "$(dadd "$today" 1000)"
2 years, 8 months and 26 days
각 달의 일수가 다르므로 시작 날짜(이 경우 오늘)에 따라 결과가 달라집니다.
일부 시스템에서는 다른 패키지의 비슷한 이름의 명령과 구별하기 위해 유틸리티 이름 앞에 ( , , ) dateutils
가 붙습니다.dateutils.
dateutils.dseq
dateutils.dadd
dateutils.ddiff
답변2
이러한 연산을 단순화하는 경우 정수 연산을 직접 적용하면 대략적인 답을 얻을 수 있습니다.
d=1000 # days interval
yd=365 # days per year
md=$((yd/12)) # days per month
y=$((d/yd)) # years
d=$((d-y*yd)) # remaining days
m=$((d/md)) # months
d=$((d-m*md)) # remaining days
echo y=$y, m=$m, d=$d
산출
y=2, m=9, d=0
테스트 목적으로 이를 (n 읽을 수 없는) 함수로 압축한 다음 몇 가지 제한 사항을 탐색할 수 있습니다.
ymd() ( d=$1; echo -n "$d ==> "; yd=365; y=$((d/yd)); d=$((d-y*yd)); md=$((yd/12)); m=$((d/md)); d=$((d-m*md)); echo "y=$y, m=$m, d=$d"; )
그러면 다음과 같이 원하는 답변을 얻을 수 있습니다.
ymd 1000
1000 ==> y=2, m=9, d=0
그리고
ymd $((2*365))
730 ==> y=2, m=0, d=0
하지만 1년은 12개월 30일이 없기 때문에
ymd $((2*365 -1))
729 ==> y=1, m=12, d=4