将HH:MM:SS(小时:分钟:秒.split秒)转换为秒的简单方法

时间:2010-02-02 03:28:06

标签: linux bash shell time

使用Bash脚本将00:20:40.28(HH:MM:SS)转换为秒的简单方法是什么?

可以删除分秒,这不是必需的。

13 个答案:

答案 0 :(得分:46)

试试awk。作为奖励,你可以保持分秒。

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

答案 1 :(得分:3)

试试这个:

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

($ < string> )根据拆分器(IFS)拆分< string>

$ {< array> [< index> ]}在< array> 的元素><索引> 的

$((< arithmetic expression> ))执行算术表达式。

希望这有帮助。

答案 2 :(得分:2)

即使您未指定小时或分钟,这也会有效:echo "04:20:40" | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc

答案 3 :(得分:2)

如果您正在处理ps的时间,请注意格式2-18:01也可以使用2天,19小时,1分钟。在这种情况下,您需要结帐:Parse ps' "etime" output and convert it into seconds

答案 4 :(得分:2)

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

答案 5 :(得分:1)

如果你不知道你到底有什么 - SS,MM:SS或HH:MM:SS,就像在youtube-dl --get-duration之后那样,那么awk magic可能会有用:

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

答案 6 :(得分:0)

我没有对此进行过测试,但我认为这是你分割字符串的方式。然后乘以适当的小时和分钟数量。

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

答案 7 :(得分:0)

使用shell,

#!/bin/bash

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

答案 8 :(得分:0)

您可以使用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 with obase是额外的!

答案 9 :(得分:0)

使用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扩展。

答案 10 :(得分:0)

我有这个旧的shell函数(在POSIX shell上是/ 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:)

答案 11 :(得分:0)

TZ=utc date +'%s' -d "1970-01-01 00:00:38"

答案 12 :(得分:0)

我认为最简单的方法是从纪元时间开始计算:

WITH test_table(col1, col2) AS (
    SELECT 1, array_construct('toto@gmail.com', 'hello@yahoo.com')
)

SELECT
    col1,
    col2,
    pseudonymize_email(col2) as hashed_emails
FROM test_table

您还可以根据需要轻松更改格式。