当前位置: 首页 > 知识库问答 >
问题:

Bash:以天、小时、分钟、秒为单位显示秒

林博厚
2023-03-14

我有一个函数,受hms的启发,但我希望将其扩展到包括处理和显示天数。

我已经开始编辑脚本,但很快意识到我在处理逻辑方面超出了我的深度,几个小时跑到几天,反之亦然......

以下是我到目前为止所拥有的:

#!/bin/bash

rendertimer(){
    # convert seconds to Days, Hours, Minutes, Seconds
    # thanks to https://www.shellscript.sh/tips/hms/
    local seconds D H M S MM D_TAG H_TAG M_TAG S_TAG
    seconds=${1:-0}
    S=$((seconds%60))
    MM=$((seconds/60)) # total number of minutes
    M=$((MM%60))
    H=$((MM/60))
    D=$((H/24))

    # set up "x day(s), x hour(s), x minute(s) and x second(s)" format
    [ "$D" -eq "1" ] && D_TAG="day" || D_TAG="days"
    [ "$H" -eq "1" ] && H_TAG="hour" || H_TAG="hours"
    [ "$M" -eq "1" ] && M_TAG="minute" || M_TAG="minutes"
    [ "$S" -eq "1" ] && S_TAG="second" || S_TAG="seconds"
    # logic for handling display
    [ "$D" -gt "0" ] && printf "%d %s " $D "${D_TAG},"
    [ "$H" -gt "0" ] && printf "%d %s " $H "${H_TAG},"
    [ "$seconds" -ge "60" ] && printf "%d %s " $M "${M_TAG} and"
    printf "%d %s\n" $S "${S_TAG}"
}

duration=${1}

howlong="$(rendertimer $duration)"
echo "That took ${howlong} to run."

349261秒:“那花了4天1小时1分1秒才运行。”

< code>127932秒:“运行时间为1天11小时32分12秒。”

< code>86400秒:“花了1天时间运行。”

349261秒:“这花了4天97小时1分1秒才运行。

127932秒:“运行时间为1天35小时32分12秒。”

86400秒:“那需要1天24小时0分0秒才能运行。”

有人能帮我弄清楚吗?

共有2个答案

韦安怡
2023-03-14

感谢@BeardOverflow和@NikolaySidorov,这非常有效:

#!/bin/bash

rendertimer(){
    # convert seconds to Days, Hours, Minutes, Seconds
    # thanks to Nikolay Sidorov and https://www.shellscript.sh/tips/hms/
    local parts seconds D H M S D_TAG H_TAG M_TAG S_TAG
    seconds=${1:-0}
    # all days
    D=$((seconds / 60 / 60 / 24))
    # all hours
    H=$((seconds / 60 / 60))
    H=$((H % 24))
    # all minutes
    M=$((seconds / 60))
    M=$((M % 60))
    # all seconds
    S=$((seconds % 60))

    # set up "x day(s), x hour(s), x minute(s) and x second(s)" language
    [ "$D" -eq "1" ] && D_TAG="day" || D_TAG="days"
    [ "$H" -eq "1" ] && H_TAG="hour" || H_TAG="hours"
    [ "$M" -eq "1" ] && M_TAG="minute" || M_TAG="minutes"
    [ "$S" -eq "1" ] && S_TAG="second" || S_TAG="seconds"

    # put parts from above that exist into an array for sentence formatting
    parts=()
    [ "$D" -gt "0" ] && parts+=("$D $D_TAG")
    [ "$H" -gt "0" ] && parts+=("$H $H_TAG")
    [ "$M" -gt "0" ] && parts+=("$M $M_TAG")
    [ "$S" -gt "0" ] && parts+=("$S $S_TAG")

    # construct the sentence
    result=""
    lengthofparts=${#parts[@]}
    for (( currentpart = 0; currentpart < lengthofparts; currentpart++ )); do
        result+="${parts[$currentpart]}"
        # if current part is not the last portion of the sentence, append a comma
        [ $currentpart -ne $((lengthofparts-1)) ] && result+=", "
    done
    echo "$result"
}

duration=$1
howlong="$(rendertimer "${duration}")"
echo "That took ${howlong} to run."
云季萌
2023-03-14

代替

H=$((MM/60))
D=$((H/24))

H=$((MM/60%24))
D=$((MM/60/24))

所以,天数是你总时间的商,小时是你总时间的模数。

另外,你的第二个例子是错误的。127932的期望输出是需要1天11小时32分12秒才能运行

 类似资料:
  • 问题内容: 这就是我目前所拥有的 我觉得是对的。数小时和数天应该是- 然后- 但是我的时间和日子是不正确的 问题答案: 一种简单的计算时间的方法是使用类似 如果您的天数超过28天,则可以使用此功能,但是如果您的时间为负数,则无法使用。

  • 我试图创建一个基于时间的倒计时钟。它不是基于current_dates。将被拉取的初始时间将来自一个单独的php文件。这将是一个基于浏览器的游戏。当有人点击按钮来启动这个脚本。它将检查是否满足某些要求,如果满足,那么这个脚本将启动。根据对象的级别,它将拉动该进行中级别的初始计时器。希望这有意义。无论如何,我基于我提供的第一个代码的计时器脚本。 此脚本仅占分钟和秒。我对它进行了修改,使其也包括了天和

  • 我是Python新手,遇到了这个问题。我想创建一个程序,用户输入秒数,并将其转换为天、小时、分钟和秒。然而,例如,我希望程序在100000秒内输出1天、3小时、46分钟、40秒。然而,mine也用小数输入计算结果,比如说1.157天,其他类别也一样。任何帮助都将不胜感激,非常感谢。

  • 问题内容: 我在Microsoft SQL Server 2008R2中有一个bigint字段,其中充满了刻度线(单个刻度线代表一百纳秒或一千万分之一秒。在一毫秒内有10,000个刻度。) http://msdn.microsoft.com/zh- CN/library/system.datetime.ticks.aspx 我需要将所有记录的总和转换为Days:Hours:Minutes:Seco

  • 问题内容: 我需要将毫秒值85605304.3587转换为类似0d 18h 21m的值。不知道如何启动它,是否像C#中的SQL中有类似TimeSpan的东西? 问题答案: 您可以显式进行计算。我认为是这样: 注意:某些数据库使用代替。

  • 我有一个观察结果,希望获得吞吐量计算方面的知识,有些时间吞吐量以秒为单位显示,有些时间吞吐量以分钟为单位,有些时间吞吐量以小时为单位,请任何人提供准确答案以计算吞吐量,以及何时在Jmeter摘要报告中以秒、分钟和小时为单位显示吞吐量