Bash脚本:两次之间的分钟差异

我有两个时间string; 例如。 同一天的“09:11”和“17:22”(格式是hh:mm)。 如何计算这两者之间的时间差?

标准date库可以这样做吗?

例:

 #!/bin/bash MPHR=60 # Minutes per hour. CURRENT=$(date -u -d '2007-09-01 17:30:24' '+%F %T.%N %Z') TARGET=$(date -u -d'2007-12-25 12:30:00' '+%F %T.%N %Z') MINUTES=$(( $(diff) / $MPHR )) 

有没有一个简单的方法来做到这一点在小时和分钟hh:mm

纯粹的bash解决方案:

 old=09:11 new=17:22 # feeding variables by using read and splitting with IFS IFS=: read old_hour old_min <<< "$old" IFS=: read hour min <<< "$new" # convert hours to minutes # the 10# is there to avoid errors with leading zeros # by telling bash that we use base 10 total_old_minutes=$((10#$old_hour*60 + 10#$old_min)) total_minutes=$((10#$hour*60 + 10#$min)) echo "the difference is $((total_minutes - total_old_minutes)) minutes" 

另一个解决方案使用date (我们使用小时/分钟,所以日期并不重要)

 old=09:11 new=17:22 IFS=: read old_hour old_min <<< "$old" IFS=: read hour min <<< "$new" # convert the date "1970-01-01 hour:min:00" in seconds from Unix EPOCH time sec_old=$(date -d "1970-01-01 $old_hour:$old_min:00" +%s) sec_new=$(date -d "1970-01-01 $hour:$min:00" +%s) echo "the difference is $(( (sec_new - sec_old) / 60)) minutes" 

请参阅http://en.wikipedia.org/wiki/Unix_time

我会将日期转换为UNIX时间戳; 你可以用秒来减去差值,然后除以60:

 #!/bin/bash MPHR=60 # Minutes per hour. CURRENT=$(date +%s -d '2007-09-01 17:30:24') TARGET=$(date +%s -d'2007-12-25 12:30:00') MINUTES=$(( ($TARGET - $CURRENT) / $MPHR )) 
 MPHR=60 CURRENT=09:11 TARGET=17:22 echo $(( ( 10#${TARGET:0:2} - 10#${CURRENT:0:2} ) * MPHR + 10#${TARGET:4} - 10#${CURRENT:4} )) 

我是这样做的:

 START=$(date +%s); sleep 1; # Your stuff END=$(date +%s); echo $((END-START)) | awk '{printf "%d:%02d:%02d", $1/3600, ($1/60)%60, $1%60}' 

真的很简单,就是在开始的秒数,然后采取最后秒数,并以分钟打印差异:秒。

 STARTTIME=$(date +%s) 

您的代码:

 ENDTIME=$(date +%s) secs=$(($ENDTIME - $STARTTIME)) printf 'Elapsed Time %dh:%dm:%ds\n' $(($secs/3600)) $(($secs%3600/60)) $(($secs%60)) 

我正在寻找一个解决方案,秒。 在这里找到: 如何计算bash脚本中的时差?

 #!/bin/bash string1="10:33:56" string2="10:36:10" StartDate=$(date -u -d "$string1" +"%s") FinalDate=$(date -u -d "$string2" +"%s") date -u -d "0 $FinalDate sec - $StartDate sec" +"%H:%M:%S" 

我在这里给Gilles的解决方案增加了几秒钟:

 function countTimeDiff() { timeA=$1 # 09:59:35 timeB=$2 # 17:32:55 # feeding variables by using read and splitting with IFS IFS=: read ah am as <<< "$timeA" IFS=: read bh bm bs <<< "$timeB" # Convert hours to minutes. # The 10# is there to avoid errors with leading zeros # by telling bash that we use base 10 secondsA=$((10#$ah*60*60 + 10#$am*60 + 10#$as)) secondsB=$((10#$bh*60*60 + 10#$bm*60 + 10#$bs)) DIFF_SEC=$((secondsB - secondsA)) echo "The difference is $DIFF_SEC seconds."; SEC=$(($DIFF_SEC%60)) MIN=$((($DIFF_SEC-$SEC)%3600/60)) HRS=$((($DIFF_SEC-$MIN*60)/3600)) TIME_DIFF="$HRS:$MIN:$SEC"; echo $TIME_DIFF; } 

@Dorian
如果你只是想知道一个程序运行多久:时间,男人,男人的时间!

微不足道的例子:

 jonathan@Odin:~$ time sleep 1 real 0m1.001s user 0m0.000s sys 0m0.000s 

好吧,它不会在几秒钟内给出结果,但您可以使用格式字符串,或者更简单地使用POSIX合规性选项来完成:

 jonathan@Odin:~$ time -p sleep 20 real 20.00 user 0.00 sys 0.00