Shell脚本中hhmm格式时间差计算报错的解决方法求助
解决Shell中hhmm格式时间差计算问题
错误原因
Shell算术扩展中,以0开头的数字会被默认解析为八进制,而八进制仅允许数字0-7。变量time2=0950包含非法的八进制数字9,因此执行$(($time1-$time2))时触发格式错误。
可行解决方案
方案1:转换为分钟数计算(推荐,支持跨天场景)
将hhmm格式的时间转换为当日总分钟数,计算差值后再转回hhmm格式,同时强制按十进制解析数字避免八进制问题:
time1=1333 time2=0950 # 把时间转成当日总分钟数(10#前缀强制十进制解析) min1=$(( ${time1:0:2} * 60 + ${time1:2:2} )) min2=$(( 10#${time2:0:2} * 60 + 10#${time2:2:2} )) # 计算时间差(若需支持time1 < time2的跨天场景,可改为 (min1 - min2 + 1440) % 1440) delta_min=$(( min1 - min2 )) # 转回hhmm格式,用printf补前导零 deltaTime=$(printf "%02d%02d" $(( delta_min / 60 )) $(( delta_min % 60 ))) echo $deltaTime # 输出:0343
方案2:强制十进制直接计算(简洁,适用于time1 >= time2场景)
用10#前缀强制Shell将数字按十进制解析,计算差值后补前导零到4位:
time1=1333 time2=0950 # 强制十进制计算差值 delta=$(( 10#$time1 - 10#$time2 )) # 补前导零到4位 deltaTime=$(printf "%04d" $delta) echo $deltaTime # 输出:0343
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

