debian.org / О Debian Где взять Debian Поддержка Уголок разработчика Новости Wiki

Автор Тема: арифметика с временем на bash [РЕШЕНО]  (Прочитано 6357 раз)

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

Оффлайн A_STAS

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 16
Всем привет!
как написать правильно вот такое на bash?

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

в $date3 нужно получить 00:02:09
спс.
« Последнее редактирование: 04 Апрель 2013, 20:53:55 от A_STAS »
 

Оффлайн rayanAyar

  • Старожил
  • ****
  • Сообщений: 538
  • Jabber: rayanAyar@jabber.ru
Re: арифметика с временем на bash
« Ответ #1 : 01 Апрель 2013, 18:10:19 »
Я делаю так:
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

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 16
Re: арифметика с временем на bash
« Ответ #2 : 01 Апрель 2013, 20:41:29 »
user@debian:~$ echo "$DT_START $DT_END"
1364837682 1364837699

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

yura_n

  • Гость
Re: арифметика с временем на bash
« Ответ #3 : 01 Апрель 2013, 21:34:46 »
Bash немного не тот язык, чтобы подобное проделывать. Вам надо разобрать на секунды первое и второе время, вычесть разницу и результат в секундах преобразовать обратно.
« Последнее редактирование: 01 Апрель 2013, 21:36:25 от yura_n »
 

Оффлайн A_STAS

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 16
Re: арифметика с временем на bash
« Ответ #4 : 01 Апрель 2013, 21:54:58 »
Вам надо разобрать на секунды первое и второе время, вычесть разницу и результат в секундах преобразовать обратно.

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

yura_n

  • Гость
Re: арифметика с временем на bash
« Ответ #5 : 01 Апрель 2013, 22:41:24 »
Вот как то так:
#!/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

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 16
Re: арифметика с временем на bash
« Ответ #6 : 02 Апрель 2013, 17:57:52 »
Спасибо 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

  • Гость
Re: арифметика с временем на bash
« Ответ #7 : 02 Апрель 2013, 21:18:03 »
обнаружил, случайно, что до 07 все ОК, а потом с 08
Когда вы добавляете ноль перед цифрой - bash думает, что вы задаете ему восьмеричное значение. Поэтому все значения больше семерки у вас не работают.
user@debian:~$ $(( $Chas*3600 ))
Так работать не будет потому, что вы пытаетесь выполнить математические действия ни к чему их не приравнивая. Чтобы это заработало нужна переменная.
Напоминаю, что мне нужно в формате "00:00:00"
Добавить ноль к результату несложно. Достаточно всего лишь завернуть в кавычки полученные значения. Например:
#!/bin/bash

Nol=0
Chas=5
if [ "$Chas" -lt 10 ]
then
Chas="$Nol""$Chas"
fi
echo $Chas
« Последнее редактирование: 02 Апрель 2013, 21:25:45 от yura_n »
 

Оффлайн A_STAS

  • Пользователь
  • *
  • Topic Author
  • Сообщений: 16
Re: арифметика с временем на bash
« Ответ #8 : 02 Апрель 2013, 21:47:06 »
Спасибо, понял.

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

Русскоязычное сообщество Debian GNU/Linux

Re: арифметика с временем на bash
« Ответ #8 : 02 Апрель 2013, 21:47:06 »


Теги: