LINUX.ORG.RU

Как на этом баше вычитать относительное время

 , , ,


0

1

Чет я запарился с поисками. Короч нужно вычитать но и складывать иногда тоже время в формате HH:MM:SS.LLL. L это милисекунды типо. Хотел сначала просто на авке накатать вычитание по столбцам по двум сепараторам а потом понял что надо еще костылить как то ограничение по пограничным значениям для каждого из столбца а это уже полная фигня выйдет, надо всякие инкременты и декременты по левым полям вводить. Готовое че то есть уже? Мне просто надо загнать в скрипт три значения. Типо я даю первоначальное смещение 00:01:12.202 и точку отсчета 00:02:00.000 а он мне выдает разницу 00:00:47.798. Через date с эпохальными ключами вроде как не выйдет оно не умеет в относительную эпоху.

В пень баш крче для этой задачи. Сделал на змее. Кому надо юзайте

from datetime import datetime

t1 = '00:00:04.450'
t2 = '00:12:06.000'
t3 = datetime.strptime(t2, '%H:%M:%S.%f') - datetime.strptime(t1, '%H:%M:%S.%f')

print(t3)
0:12:01.550000
Linux_Newbie
() автор топика
Ответ на: комментарий от Linux_Newbie

Ну, например. Очень по-быстрому накидал. Вот только с отрицательной разницей траблы будут.

$ t1=$(date -d "00:00:04.450" +%s%N)
$ t2=$(date -d "00:12:06.000" +%s%N)
$ bc <<< "scale=3; ($t2-$t1)/1000000000"
721.550
$ date -u -d '@721.550' +%H:%M:%S.%N
00:12:01.550000000
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok
$ bc <<< "scale=3; ($t2-$t1)/1000000000"

Это можно и так:

$ printf "%f\n" $((t2-t1))e-9
721,550000
Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Вот только с отрицательной разницей траблы будут.

Всегда от большего отнимать меншее, и когда надо, негативить результат.

Oleg_Iu
()

Короч нужно вычитать но и складывать иногда тоже время в формате HH:MM:SS.LLL.

Постановка неправильная, складывать время нельзя. Только время с интервалами, или интервалы с интервалами.

t184256 ★★★★★
()
Ответ на: комментарий от Oleg_Iu

Всегда от большего отнимать меншее, и когда надо, негативить результат.

Ну это разумеется. Тут еще один момент есть. Надо бы дату фиксировать (то есть явно указать), а то он когда вычитает, то она вычитается. Можно фиксировать 1970-01-01 по UTC (с ключом -u). Тогда от нуля всегда время в секундах и наносекундах будет выдаваться. Иначе можно неприятность отхватить. Я как-то сразу об этом не подумал. В date вроде бы нельзя указать входной формат, то есть чтобы дату игнорировать. То есть что даты нет как бы. Можно неприятности отхватить. Особенно при сложении.

$ date -d "00:00:04.450" +%s%N
1622322004450000000
$ date -u -d "1970-01-01 00:00:04.450" +%s%N
4450000000
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Linux_Newbie

t3 = datetime.strptime(t2, '%H:%M:%S.%f') - datetime.strptime(t1, '%H:%M:%S.%f')

пробовать неохота, но что будет, если ты сложишь 23:59:59 и 23:59:59? Какой результат ты вообще ожидаешь? Ведь переполнение будет как бы. Как datetime это обработает?

Zubok ★★★★★
()
Ответ на: комментарий от t184256

нет же, как раз ТС пытается не переделывать

сначала он решал на баше какую-то задачку. получилось… надо добавить вот эту фичу – легко … а вот эту… тоже просто… <идет время, скрипт растет> … теперь надо ещё интервалы времени вычислять. что-то не очень получается… переписать всё? да ну, столько заново делать…

(я знаю – сам такой :)

anonymous
()
Ответ на: комментарий от anonymous

сначала он решал на баше какую-то задачку. получилось… надо добавить вот эту фичу – легко … а вот эту… тоже просто… <идет время, скрипт растет>

Вот на скрине [1] в галерее давно описывалась ситуация, когда скрипт на shell для автоматизации производства печатных плат уже был 300 кБ.

[1] CAM Genesis, предпроизводственная подготовка печатных плат

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

это впечатляет. у меня таких монстров нет (пока?). «технологию создания» я уже описывал

когда появляется дополнительная «хотелка» проще её дописать, чем переписывать всё с нуля.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.