【问题标题】:convert a DURATION HH:MM:SS to seconds in bash在 bash 中将 DURATION HH:MM:SS 转换为秒
【发布时间】:2013-08-09 14:29:49
【问题描述】:

我想找到一种方法可以轻松地将持续时间(而不是 1970 年等的时间等)转换为以秒为单位的持续时间,例如 05:42:32。请问有没有一种简单快捷的方法可以在bash中做到这一点? 我尝试使用“日期”和 %s 等,但它总是返回自 1970 年以来的时间,我只想要一个持续时间。

谢谢!

【问题讨论】:

    标签: bash time duration


    【解决方案1】:

    awk 算不算 bash?

    $ echo "05:42:32" | awk -F':' '{print $1 * 60 * 60 + $2 * 60 + $3}'
    20552
    

    如果您还需要解析没有小时的持续时间:

    awk -F':' '{if (NF == 2) {print $1 * 60 + $2} else {print $1 * 60 * 60 + $2 * 60 + $3}}'
    

    【讨论】:

    • 另外,如何在名为“duration”的变量中获取它而不是回显结果?谢谢!
    • 您可以使用variable=$( command ) 将任何命令的结果分配给变量。所以duration=$( wherever_you_get_your_time_from | awk ... )
    • 好的,谢谢。我这样做了,但我错误地删除了回声。
    【解决方案2】:

    您可以使用 IFS 将时间拆分为小时、分钟和秒。

    #! /bin/bash
    
    to_seconds () {
        IFS=: read h m s <<< "$1"
        echo $(( 10#$h * 3600 + 10#$m * 60 + 10#$s ))
    }
    
    duration=05:42:32
    to_seconds $duration
    

    【讨论】:

    • multiply 是干什么用的?
    • @PavelAnossov:哎呀,谢谢。已删除。我最初是在尝试从右边取数字,将它们乘以 1、60 和 3600...
    • 你也使用了 $duration 而不是 $1。
    • @PavelAnossov:再次感谢。我猜该喝咖啡了。
    • 您将收到值“08”和“09”的八进制错误。您需要指定基数 10:$(( 10#$h * 3600 + 10#$m * 60 + 10#$s ))
    【解决方案3】:

    Pavel 的答案几乎是标准解决方案。

    只是为了好玩,你也可以这样做(sed + bc)

    kent$  echo "05:42:32"|sed 's/:/*60+/g;s/*60/&&/'|bc
    20552
    

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      相关资源
      最近更新 更多