арифметика с временем на bash [РЕШЕНО]

Автор A_STAS, 01 апреля 2013, 15:47:10

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

A_STAS

Всем привет!
как написать правильно вот такое на bash?

user@debian:~$ date1="10:12:16"
user@debian:~$ date2="10:14:25"
user@debian:~$ date3=$(date2 - date1)

в $date3 нужно получить 00:02:09
спс.

rayanAyar

Я делаю так:

DT_START=$(date +%s)
echo "Do something" ; sleep 5s
DT_END=$(date +%s)
DT_TOTAL=$(expr $DT_END - $DT_START)
echo "Общее время выполнения: $DT_TOTAL сек"


A_STAS

user@debian:~$ echo "$DT_START $DT_END"
1364837682 1364837699

Спасибо, но это не то.
date1 и date2 это начало и конец фрагмента видео.
Их я ввожу вручную и в таком виде как написано.

yura_n

#3
Bash немного не тот язык, чтобы подобное проделывать. Вам надо разобрать на секунды первое и второе время, вычесть разницу и результат в секундах преобразовать обратно.

A_STAS

Цитата: yura_n от 01 апреля 2013, 21:34:46
Вам надо разобрать на секунды первое и второе время, вычесть разницу и результат в секундах преобразовать обратно.

Вот, вот, а как? Весь инет перерыл. Для РНР есть, для делфи есть, а для bash не найду.

yura_n

Вот как то так:

#!/bin/bash

# Преобразование первого времени
Chas=10
Min=12
Sek=25
Time1=$(( $Chas*3600+$Min*60+Sek ))

# Преобразование второго времени
Chas=10
Min=14
Sek=25
Time2=$(( $Chas*3600+$Min*60+Sek ))

# Вычисление разницы между первым и вторым временем
Time3=$(( $Time2-$Time1 ))

# Получение часов из разницы
Chas=$(( $Time3/3600 ))

# Получение минут из разницы
Min=$(( $(( $Time3-$Chas*3600 ))/60 ))

# Получение секунд из разницы
Sek=$(( $Time3-$(( $Chas*3600+$Min*60 )) ))
echo $Chas
echo $Min
echo $Sek

Могут быть ошибки, набросал достаточно бегло. Кроме того, нужно условие, если второе время меньше первого и соответствующая для этого случая коррекция.

A_STAS

Спасибо yura_n.
Я тоже начал подобное шкрябать и вот, что обнаружил, случайно, что до 07 все ОК, а потом с 08:

user@debian:~$ Chas=07
user@debian:~$ $(( $Chas*3600 ))
bash: 25200: command not found
user@debian:~$ Chas=08
user@debian:~$ $(( $Chas*3600 ))
bash: 08: value too great for base (error token is "08")
user@debian:~$

Поэтому начал удалять впереди стоящие нули, а потом арифметика.
Напоминаю, что мне нужно в формате "00:00:00"

Скрипт накалякал, вроде работает, но это помоему не то.
Где то должно быть, что то на подобии timetostr, как в лазарусе.

yura_n

#7
Цитата: A_STAS от 02 апреля 2013, 17:57:52обнаружил, случайно, что до 07 все ОК, а потом с 08
Когда вы добавляете ноль перед цифрой - bash думает, что вы задаете ему восьмеричное значение. Поэтому все значения больше семерки у вас не работают.
Цитата: A_STAS от 02 апреля 2013, 17:57:52user@debian:~$ $(( $Chas*3600 ))
Так работать не будет потому, что вы пытаетесь выполнить математические действия ни к чему их не приравнивая. Чтобы это заработало нужна переменная.
Цитата: A_STAS от 02 апреля 2013, 17:57:52Напоминаю, что мне нужно в формате "00:00:00"
Добавить ноль к результату несложно. Достаточно всего лишь завернуть в кавычки полученные значения. Например:

#!/bin/bash

Nol=0
Chas=5
if [ "$Chas" -lt 10 ]
then
Chas="$Nol""$Chas"
fi
echo $Chas


A_STAS

#8
Спасибо, понял.

я делал так, может и не правильно но работает:
# освободиться от нулей стоящих впереди (01 ... 09)
if [ "$Hours" -lt "10" ]; then Hours=${Hours#*0};fi
дальше арифметика
   ...
# если часов меньше 10 тогда дозаписываем в переменную 0
if [ "$timeH" -lt "10" ]; then timeH=0${timeH}; fi