【问题标题】:Bash script: difference in minutes between two timesBash脚本:两次之间的分钟差
【发布时间】:2023-03-28 09:57:01
【问题描述】:

我有两个时间字符串;例如。同一天的“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 中的小时和分钟,有没有更简单的方法来做到这一点

【问题讨论】:

    标签: linux bash shell datetime


    【解决方案1】:

    解决方案:

    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

    【讨论】:

    • 在我得到的日期解决方案中:用法:日期 [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt 日期 | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+格式]
    • 第一个有效 :) 谢谢!但我认为日期使用不正确,因为我收到使用错误
    • date 解决方案对我来说效果很好。最后一个算术运算中缺少一些括号(已更正)。日期(GNU coreutils)8.20
    【解决方案2】:

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

    【讨论】:

    • 我用dt() { echo $(( ( $(date +%s -d "$2") - $(date +%s -d "$1") ) / 60 )) ; }把它包装成一个bash函数然后我可以去dt '2007-09-01 17:30:24' '2007-12-25 12:30:00'得到答案。
    【解决方案3】:

    我是这样做的:

    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】:

      我一直在寻找几秒钟内的解决方案。在这里找到: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】:
        MPHR=60
        CURRENT=09:11
        TARGET=17:22
        echo $(( ( 10#${TARGET:0:2} - 10#${CURRENT:0:2} ) * MPHR + 10#${TARGET:4} - 10#${CURRENT:4} ))
        

        【讨论】:

          【解决方案6】:
          STARTTIME=$(date +%s)
          

          你的代码:

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

          【讨论】:

          • 我认为您应该编辑您的答案,以使其更易于阅读和理解。还包括额外的 cmets 以澄清您的答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-14
          相关资源
          最近更新 更多