64

秒を時間、分、秒に変換するにはどうすればよいですか?

show_time() {
  ?????
}

show_time 36 # 00:00:36
show_time 1036 # 00:17:26
show_time 91925 # 25:32:05
4

16 に答える 16

88
#!/bin/sh

convertsecs() {
 ((h=${1}/3600))
 ((m=(${1}%3600)/60))
 ((s=${1}%60))
 printf "%02d:%02d:%02d\n" $h $m $s
}
TIME1="36"
TIME2="1036"
TIME3="91925"

echo $(convertsecs $TIME1)
echo $(convertsecs $TIME2)
echo $(convertsecs $TIME3)

float 秒の場合:

convertsecs() {
 h=$(bc <<< "${1}/3600")
 m=$(bc <<< "(${1}%3600)/60")
 s=$(bc <<< "${1}%60")
 printf "%02d:%02d:%05.2f\n" $h $m $s
}
于 2012-08-30T14:58:24.087 に答える
61

私が知っている最も簡単な方法:

secs=100000
printf '%dh:%dm:%ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))

注 - 日が必要な場合は、他の単位を追加して 86400 で割ります。

于 2015-02-11T09:59:57.547 に答える
56

シンプルなワンライナー

$ secs=236521
$ printf '%dh:%dm:%ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))
65h:42m:1s

先行ゼロ付き

$ secs=236521
$ printf '%02dh:%02dm:%02ds\n' $((secs/3600)) $((secs%3600/60)) $((secs%60))
65h:42m:01s

日で

$ secs=236521
$ printf '%dd:%dh:%dm:%ds\n' $((secs/86400)) $((secs%86400/3600)) $((secs%3600/60)) \
  $((secs%60))
2d:17h:42m:1s

ナノ秒で

$ secs=21218.6474912
$ printf '%02dh:%02dm:%02fs\n' $(echo -e "$secs/3600\n$secs%3600/60\n$secs%60"| bc)
05h:53m:38.647491s

https://stackoverflow.com/a/28451379/188159に基づいていますが、編集は拒否されました。

于 2016-09-12T14:24:02.493 に答える
38

私は次の関数を自分で使用します。

function show_time () {
    num=$1
    min=0
    hour=0
    day=0
    if((num>59));then
        ((sec=num%60))
        ((num=num/60))
        if((num>59));then
            ((min=num%60))
            ((num=num/60))
            if((num>23));then
                ((hour=num%24))
                ((day=num/24))
            else
                ((hour=num))
            fi
        else
            ((min=num))
        fi
    else
        ((sec=num))
    fi
    echo "$day"d "$hour"h "$min"m "$sec"s
}

日数もカウントされることに注意してください。また、最後の数字に対して別の結果が表示されます。

于 2012-08-30T14:59:23.843 に答える
7

上記はすべて bash 用です。「#!/bin/sh」を無視すると、basism は次のようになります。

convertsecs() {
    h=`expr $1 / 3600`
    m=`expr $1  % 3600 / 60`
    s=`expr $1 % 60`
    printf "%02d:%02d:%02d\n" $h $m $s
}
于 2013-09-08T12:46:14.633 に答える
5
t=12345;printf %02d:%02d:%02d\\n $((t/3600)) $((t%3600/60)) $((t%60)) # POSIX
echo 12345|awk '{printf "%02d:%02d:%02d",$0/3600,$0%3600/60,$0%60}' # POSIX awk
date -d @12345 +%T # GNU date
date -r 12345 +%T # OS X's date

他の人が逆の方法を探していた場合:

IFS=: read h m s<<<03:25:45;echo $((h*3600+m*60+s)) # POSIX
echo 03:25:45|awk -F: '{print 3600*$1+60*$2+$3}' # POSIX awk
于 2014-03-26T14:08:46.110 に答える
3

Vaulter/chepner のコードを正しく動作させることができませんでした。正しいコードは次のとおりだと思います。

convertsecs() {
    h=$(($1/3600))
    m=$((($1/60)%60))
    s=$(($1%60))
    printf "02d:%02d:%02d\n $h $m $s
}
于 2013-09-29T16:56:12.310 に答える
1

これは古い投稿 ovbioius です -- しかし、実際の経過時間を軍事形式で探している人のために (0:5:15:22 の代わりに 00:05:15:22 )

!#/bin/bash
    num=$1
    min=0
    hour=0
    day=0
    if((num>59));then
        ((sec=num%60))
        ((num=num/60))
            if((num>59));then
            ((min=num%60))
            ((num=num/60))
                if((num>23));then
                    ((hour=num%24))
                    ((day=num/24))
                else
                    ((hour=num))
                fi
            else
                ((min=num))
            fi
        else
        ((sec=num))
    fi
    day=`seq -w 00 $day | tail -n 1`
    hour=`seq -w 00 $hour | tail -n 1`
    min=`seq -w 00 $min | tail -n 1`
    sec=`seq -w 00 $sec | tail -n 1`
    printf "$day:$hour:$min:$sec"
 exit 0
于 2016-10-27T10:33:00.237 に答える