Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: BASH перевод времени в секунды  (Прочитано 6617 раз)

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

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7210
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
BASH перевод времени в секунды
« : 20 Марта 2014, 19:55:46 »
Нет ли в Linux стандартной тулзы для перевода времени формата:
ЧЧ:ММ:СС
и такого
ММ:СС
в секунды? Где
ЧЧ -часы
ММ -минуты
СС - секунды?
Крайне важно быстродействие, приветствуется C, ASM. Или надо самому велосипед писать?

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #1 : 20 Марта 2014, 21:07:31 »
 :2funny:
echo "02:02:32" | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7210
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #2 : 20 Марта 2014, 21:22:47 »
Чистый, спасибо, жаль что без sed никак. Не люблю я его синтаксис. Ну да ладно. Может на C напишу тулзу для себя (код каждую секунду выполняться будет, так что, чем меньше нагрузка на CPU и чем больше скорость, тем лучше).

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #3 : 20 Марта 2014, 21:24:00 »
peregrine,
ну мой ответ точно на истину не претендует :)
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #4 : 20 Марта 2014, 21:25:16 »
можно попробовать высчитать время за счет махинации вида от текущей даты отнять нужное тебе время запомнить это время потом отнять результат от текущего времени и сказать что бы вернула в секундах, но все это ерунда :)
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #5 : 20 Марта 2014, 21:32:52 »
date --date='1970-01-01 01:00:00 UTC' +%s— показывает количество секунд прошедших с 1970-01-01 00:00:00 UTC
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7210
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #6 : 20 Марта 2014, 21:54:33 »
Azure, проблема в том, что у меня время от другой программы передаётся, это продолжительность аудио-файла, да и твоя команда показывает 3600 секунд, мне кажется, что это неверно. ;)

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #7 : 20 Марта 2014, 22:14:55 »
peregrine
Ну так я специально поставил 1 час == 3600 сукунд чтоб проверить работу команды. Что ж неправильного? ;)echo 01:00:00 | xargs -I ^ date --date='1970-01-01 ^ UTC' +%sДа, если учитывать что может быть два формата ЧЧ:ММ:СС и ММ:СС то я бы предложил использовать нелюбимый Вами sed, чтоб добавить недостающие «00:» (возможно есть и изящнее решение например c printf) echo 00:01 | sed '/:..:/!s/^/00:/' | xargs -I ^ date --date='1970-01-01 ^ UTC' +%s
« Последнее редактирование: 20 Марта 2014, 22:36:19 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7210
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #8 : 21 Марта 2014, 00:09:58 »
Azure, ну уж если sed использовать, то смысл в других инструментах. Решено.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #9 : 21 Марта 2014, 01:02:44 »
Ну не хотите sed используйте awk:echo 01:00 | awk -F : '{ if (NF>2) print ($1*60+$2)*60+$3 ; else print $1*60+$2 }'Или так может будет быстрееecho 2:02:00 | awk -F : '{ a=$1*60+$2 ; if (NF<3) print a ; else print a*60+$3 }'
Пользователь решил продолжить мысль 21 Марта 2014, 01:48:49:
Нет, одинаково 7-8 мс

Пользователь решил продолжить мысль 21 Марта 2014, 04:49:35:
Можно еще скриптом (написал на bash, но можно без проблем на любом):
Код: (bash) [Выделить]
#!/bin/bash
# time2second.sh
i=$#
s=0
l=$i
while let i
do
  s=$[$s+${!i}*60**($l-$i)]
  i=$[i-1]
done
echo $s
Если через конвейер, то вызывать через xargsecho 2:02:15 | xargs -d: ./time2second.sh
Пользователь решил продолжить мысль 21 Марта 2014, 22:14:04:
Нашел что искал (кстати работает быстрее всех):
Код: (bash) [Выделить]
#!/bin/bash
# time2second.sh
echo $[${BASH_ARGV[0]}+${BASH_ARGV[1]:-0}*60+${BASH_ARGV[2]:-0}*3600]
« Последнее редактирование: 21 Марта 2014, 22:15:18 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: BASH перевод времени в секунды
« Ответ #10 : 23 Марта 2014, 00:02:21 »
И самый красивый вариант (как на меня)
Код: (bash) [Выделить]
#!/bin/bash
# time2second.sh
s=0
while [ ${1:+defined} ] ; do
  s=$[$s*60+$1]
  shift
done
echo $s
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.065 секунд. Запросов: 25.