shell脚本变量的时间差

时间:2013-08-12 07:31:12

标签: shell time scripting

如何在shell中获得2个变量的时差

say i have 4 variables-

    t1=07:50:19:612
    t2=07:52:14:697
    t3=10:20:54:201
    t4=11:02:09:716

 and i want to find difference in times
 result=(t2-t1)+(t4-t3)

2 个答案:

答案 0 :(得分:1)

据我所知,shell不支持毫秒的日期格式。命令日期可以处理时间格式,其精度向上舍入为秒。

以下是时间格式的示例,其中第二个为最小时间单位:

t1=07:50:19
t2=07:52:14
t3=10:20:54
t4=11:02:09

t10=$(date -d $t1 +%s)
t20=$(date -d $t2 +%s)
t30=$(date -d $t3 +%s)
t40=$(date -d $t4 +%s)

result=$(expr $t20 - $t10 + $t40 - $t30)
echo $result

hour=$(expr $result / 3600)
min=$(expr $result % 3600 / 60)
sec=$(expr $result % 60)

echo $hour:$min:$sec

答案 1 :(得分:1)

如果无法忽略毫秒,我建议您定义自己的shell函数:

function getMillis()
{
     val=($(echo $1|grep -Eo "(00|[1-9][0-9]*)"))
     mil=$(( ${val[0]} * 3600000 ))
     mil=$(($mil + ${val[1]}*60000))
     mil=$(($mil + ${val[2]}*1000))
     mil=$(($mil + ${val[3]}))
     echo $mil
} 

function format()
{
     hr=$(( $1 / 3600000 ))
     mn=$(( $1 % 3600000 / 60000 ))
     sc=$(( $1 % 60000 / 1000 ))
     ms=$(( $1 % 1000 ))
     echo "$hr hours,  $mn mins, $sc secs, $ms millisecs"
}

然后您可以获得所需的结果:

res=$(( $(getMillis $t2) - $(getMillis $t1) + $(getMillis $t4) - $(getMillis $t3) ))
format $res

上面的代码只是为了说明如何做到这一点。可能还有其他优雅的解决方案。