web-dev-qa-db-ja.com

HH:MM:SS(時間:分:秒。スプリット秒)を秒に変換する簡単な方法

変換する簡単な方法は何ですか00:20:40.28(HH:MM:SS)からBashスクリプトで秒に?

スプリット秒は省略できますが、必須ではありません。

28
Mint

awkをお試しください。ボーナスとして、あなたはスプリット秒を保つことができます。

echo "00:20:40.25" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
47
dreamlax

これを試して:

T='00:20:40.28'
SavedIFS="$IFS"
IFS=":."
Time=($T)
Seconds=$((${Time[0]}*3600 + ${Time[1]}*60 + ${Time[2]})).${Time[3]}
IFS="$SavedIFS"

echo $Seconds

($<文字列>)分割 <文字列> スプリッター(IFS)に基づいています。

$ {<配列>[<インデックス>]}の要素を返します <配列> で <インデックス>

$((<演算式>))は算術式を実行します。

お役に立てれば。

3
NawaMan

psからの時間を処理している場合は、2-18:01は、2日間、19時間、1分間も可能です。その場合、チェックアウトする必要があります: psの「etime」出力を解析して秒に変換します

2
kvz
echo "40.25" | awk -F: '{ if (NF == 1) {print $NF} else if (NF == 2) {print $1 * 60 + $2} else if (NF==3) {print $1 * 3600 + $2 * 60 + $3} }'
40.25
echo "10:40.25" | awk -F: '{ if (NF == 1) {print $NF} else if (NF == 2) {print $1 * 60 + $2} else if (NF==3) {print $1 * 3600 + $2 * 60 + $3} }'
640.25
echo "20:10:40.25" | awk -F: '{ if (NF == 1) {print $NF} else if (NF == 2) {print $1 * 60 + $2} else if (NF==3) {print $1 * 3600 + $2 * 60 + $3} }'
72640.25
2
wgzhao

これは、時間や分を指定しなくても機能します:echo "04:20:40" | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc

2
Lri

GNU日付の場合、期間が24時間未満の場合は、エポックの時刻として処理することにより、変換を実行できます。

to_seconds() {
    local Epoch=$(date --utc -d @0 +%F)
    date --utc -d "$Epoch $1" +%s.%09N
}

質問の例でそれを実行する:

$ to_seconds 00:20:40.29
1240.290000000

ご了承ください --utc@%sおよび%NはすべてGNU拡張機能は、他の実装では必ずしもサポートされていません。

1
Toby Speight

bcコマンドを使用して、分を時間、秒、または分に変換できます。

例として:

1000秒間何分?

$ echo 'obase=60;1000' | bc
02 00

その後-> 2分

375分の時間は?

$ echo 'obase=60;375'| bc
06 15

その後-> 06h15

56時間は何日ですか?

$ echo 'obase=24;56' | bc
02 08

その後、02日と08時間

オバセの付いたBCは余分です!

1
Aymeric Do

正確に何を持っているのかわからない場合-youtube-dl --get-durationの後のように、SS、MM:SS、またはHH:MM:SSの場合、awkマジックが役立ちます。

echo 12 | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }'
12
echo 35:12 | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }'
2112
echo 1:35:12 | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }'
5712
1
mikevmk

私はこれをテストしていませんが、これは文字列を分割する方法だと思います。その後、時間と分の適切な量を掛けます。

mytime=’00:20:40.28′
part1=${mytime%%:*}; rest=${mytime#*:}
part2=${rest%%:*}; rest=${rest#*:}
part3=${rest%%:*};
0
netricate

シェルで

#!/bin/bash

d="00:20:40.28"
IFS=":"
set -- $d
hr=$(($1*3600))
min=$(($2*60))
sec=${3%.*}
echo "total secs: $((hr+min+sec))"
0
ghostdog74

私はこの古いShell関数(POSIXシェルの意味では/ bin/sh互換で、bashではありません)を持っています。

tim2sec() {
    mult=1
    arg="$1"
    res=0
    while [ ${#arg} -gt 0 ]; do
        prev="${arg%:*}"
        if [ "$prev" = "$arg" ]; then
            curr="${arg#0}"  # avoid interpreting as octal
            prev=""
        else
            curr="${arg##*:}"
            curr="${curr#0}"  # avoid interpreting as octal
        fi
        curr="${curr%%.*}"  # remove any fractional parts
        res=$((res+curr*mult))
        mult=$((mult*60))
        arg="$prev"
    done
    echo "$res"
}

出力:

$ tim2sec 1:23:45.243
5025

SS、MM:SS、HH:MM:SSでのみ機能します:)

0
tzot