LINUX.ORG.RU
ФорумAdmin

Строковое представление времени в секундах

 , ,


0

2

Есть время в формате «Ч:М:С». Также может быть в форме «М:С», или вообще «С». Хочу получить количество секунд.

Делаю в баш-скрипте так:

echo $1 | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
как бы работает, но, естественно только для «Ч:М:С». Строку «1:5» воспринимает как 1 час 5 минут , а надо как 1мин 5 сек.

Другой способ:

secs=$(date -d "1970-01-01T$1 UTC" "+%s")
echo $secs

Та же самая беда: первое поле воспринимается как количество часов.

Есть способ, без громоздких вычислений длины переменной и её переформатирования в вид ЧЧ:ММ:СС?

Перемещено hobbit из general

★★★

Ответ на: комментарий от vvn_black

В случае с одним полем работает некорректно. Сделал так:

cols=`echo $1 | awk -F: '{ print NF }'`
if [[ $cols -gt 1 ]]
then
    echo $1 | awk -F: '{ print ((NF > 2) ? ($(NF-2) * 3600) : 0) + ($(NF-1) * 60) + $NF }'
else
    echo $1
fi

Chord ★★★
() автор топика
Последнее исправление: Chord (всего исправлений: 1)
$ echo '1'     | sed 's/^/0:0:/' | awk 'BEGIN {FS=":"; OFS=":"} {print $(NF-2),$(NF-1),$NF}'
0:0:1

$ echo '1:2'   | sed 's/^/0:0:/' | awk 'BEGIN {FS=":"; OFS=":"} {print $(NF-2),$(NF-1),$NF}'
0:1:2

$ echo '1:2:3' | sed 's/^/0:0:/' | awk 'BEGIN {FS=":"; OFS=":"} {print $(NF-2),$(NF-1),$NF}'
1:2:3


date -d "1970-01-01T${X} UTC" "+%s"
futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 1)
Ответ на: комментарий от futurama

Это как-бы унифицирует формат представления времени, но мне нужно именно в секундах, чтобы потом производить арифметические операции, а над 1:2:5 и 2:23 операцию сложения не произвести

Chord ★★★
() автор топика
Ответ на: комментарий от futurama

Я уже упоминал это

date -d «1970-01-01T${X} UTC» «+%s»
в ОП. Оно работает, если время всегда представлено в виде «Ч:М:С». Но для этого нужны дополнительные промежуточные преобразования всех возможных форматов входных параметров, их приведение к виду «Ч:М:С», и потом преобразовывать в количество секунд. Зачем, если можно сразу преобразовать любой формат в количество секунд.

Chord ★★★
() автор топика
$ echo '{+/⍵×60⋆(⌽⍳⍴⍵←⍎¨(":"≠⍵)⊂⍵)-1}∈¯1↑⎕ARG\n)OFF' | apl -s -- "15" 
15

$ echo '{+/⍵×60⋆(⌽⍳⍴⍵←⍎¨(":"≠⍵)⊂⍵)-1}∈¯1↑⎕ARG\n)OFF' | apl -s -- "2:15"
135

$ echo '{+/⍵×60⋆(⌽⍳⍴⍵←⍎¨(":"≠⍵)⊂⍵)-1}∈¯1↑⎕ARG\n)OFF' | apl -s -- "01:02:15"
3735
anonymous
()
Ответ на: комментарий от Chord

вот же ты тупишь

$ set 11
$ date -d "1970-01-01T$(echo "0:0:$1" | awk 'BEGIN {FS=":"; OFS=":"} {print $(NF-2),$(NF-1),$NF}') UTC" "+%s"
11

$ set 11:12
$ date -d "1970-01-01T$(echo "0:0:$1" | awk 'BEGIN {FS=":"; OFS=":"} {print $(NF-2),$(NF-1),$NF}') UTC" "+%s"
672

$ set 11:12:13
$ date -d "1970-01-01T$(echo "0:0:$1" | awk 'BEGIN {FS=":"; OFS=":"} {print $(NF-2),$(NF-1),$NF}') UTC" "+%s"
40333
futurama ★★★★★
()
Ответ на: комментарий от futurama

да, затупил. Видел что добавление незначащих нулей, но подумал что не сработает и не стал проверять, т.к ещё и sed было заюзано в первом варманте. А оно работает, каюсь

Chord ★★★
() автор топика
Последнее исправление: Chord (всего исправлений: 1)