![在 bash 和 shell 脚本中将格式“1000 天”转换为格式 2 年、9 个月、0 天的 KISS 方法是什么?](https://linux22.com/image/225339/%E5%9C%A8%20bash%20%E5%92%8C%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%B0%86%E6%A0%BC%E5%BC%8F%E2%80%9C1000%20%E5%A4%A9%E2%80%9D%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%A0%BC%E5%BC%8F%202%20%E5%B9%B4%E3%80%819%20%E4%B8%AA%E6%9C%88%E3%80%810%20%E5%A4%A9%E7%9A%84%20KISS%20%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
在 shell 脚本中将“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
但因为一年中没有12个月30天,
ymd $((2*365 -1))
729 ==> y=1, m=12, d=4