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

时间:2013-01-13 22:40:18

标签: linux bash shell datetime

我有两个时间字符串;例如。同一天“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

中给出小时和分钟是否有更简单的方法

7 个答案:

答案 0 :(得分:15)

解决方案:

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

答案 1 :(得分:14)

我会将日期转换为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 ))

答案 2 :(得分:4)

MPHR=60
CURRENT=09:11
TARGET=17:22
echo $(( ( 10#${TARGET:0:2} - 10#${CURRENT:0:2} ) * MPHR + 10#${TARGET:4} - 10#${CURRENT:4} ))

答案 3 :(得分: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}'

非常简单,在开始时取秒数,然后在结束时取秒数,然后以分钟为单位打印差异:秒。

答案 4 :(得分:3)

我正在寻找一个秒的解决方案。在此处找到:How to calculate time difference in bash script?

#!/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;
}

答案 5 :(得分:2)

STARTTIME=$(date +%s)

你的代码:

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

答案 6 :(得分:1)

@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