计算时间差

时间:2017-06-07 14:32:18

标签: bash date-difference

我试图将两个日期之间的差异(以小时,分钟和秒为单位)设置为变量。格式为+%y%m%d%H%M%S(例如:170607162412)。

例如:170607162400和170607162410 = 00:00:10

我尝试了很多,但我无法弄清楚。

2 个答案:

答案 0 :(得分:1)

看看这里:http://www.unix.com/tips-and-tutorials/31944-simple-date-time-calulation-bash.html。 诀窍是将您的日期转换为时间戳(自1970年1月1日起的秒数.UTC)。比你可以添加和删除秒,甚至相互减去日期。

date2stamp () {
    date --utc --date "$1" +%s
}

stamp2date (){
    date --utc --date "1970-01-01 $1 sec" "+%Y-%m-%d %T"
}

dateDiff (){
    case $1 in
        -s)   sec=1;      shift;;
        -m)   sec=60;     shift;;
        -h)   sec=3600;   shift;;
        -d)   sec=86400;  shift;;
        *)    sec=86400;;
    esac
    dte1=$(date2stamp $1)
    dte2=$(date2stamp $2)
    diffSec=$((dte2-dte1))
    if ((diffSec < 0)); then abs=-1; else abs=1; fi
    echo $((diffSec/sec*abs))
}

答案 1 :(得分:0)

使用date放入秒,然后减去。然后解析分钟和秒:

$ var1=170607162400
$ var2=170607162410
$ var="$var1"
$ date1="20${var:0:2}/${var:2:2}/${var:4:2 {var:6:2}:${var:8:2}:${var:10:2}"
$ var="$var2"
$ date2="20${var:0:2}/${var:2:2}/${var:4:2} ${var:6:2}:${var:8:2}:${var:10:2}"
$ sec1=$( date -d "$date1" '+%s' )
$ echo $sec1
1496867040
$ sec2=$( date -d "$date2" '+%s' )
$ echo $sec2
1496867050
$ dt=$(( sec2 - sec1 ))
$ echo $dt
10
$ min=$(( dt/60 ))
$ sec=$(( dt - 60*min ))
$ minsec=$( printf "%02d:%02d" "$min" "$sec" )
$ echo "$minsec"
00:10

如果您还需要几小时,请更改最后一行:

$ hrs=$(( dt/3600 ))
$ min=$(( (dt - 3600*hrs) / 60 ))
$ sec=$(( dt - 3600*hrs - 60*min ))
$ hms=$( printf "%d:%02d:%02d" "$hrs" "$min" "$sec" )