Как мне получить количество времени, в течение которого что-то занято, используя только временные метки?

#java

#java

Вопрос:

У меня есть куча временных меток, на которые нанесены соответствующие операции (изгиб, лазер и т. Д.) У меня есть часы в день, которые мы открыты (16 часов или определенные часы, например, с 2:30 до 11:00 вечера)

Основываясь на множестве временных меток (с начальным и конечным временем) с этой операцией и пользователем, выполняющим ее, как я могу определить из 18 часов, которые мы открыты, сколько часов работает эта машина?

Я представил сумму всех различий во времени, но, по-видимому, требуется сравнить каждую временную метку и найти, что часы не заняты, например, если 2-10 — это когда мы открыты, и одна партия выполняется с 2-4, а другая с 3-4, тогда мы не заняты в течение 6 часов.

Возможно ли это, если да, то как?

Комментарии:

1. Было бы хорошо, если бы вы могли публиковать примеры данных

Ответ №1:

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

В самом простом:

занято = сумма всех (время окончания — время начала) для каждого действия.

Возьмите 2:

  1. Создайте класс, который представляет временной интервал (имеет время начала и время окончания).
  2. Внедрите компаратор для класса TimeSpan, который сортирует по времени начала.
  3. Запустите свой список пар времени начала и окончания и создайте интервал времени для каждого, добавьте это в список.
  4. Отсортируйте список с помощью компаратора временных интервалов.
  5. Запустите список (один раз) и объедините любые временные интервалы, которые перекрываются. Перекрытие == если время начала 2-го временного интервала меньше времени окончания 1-й временной метки, происходит перекрытие.
  6. Чтобы создать объединенный временной интервал, время начала — это время начала 1-й временной метки, а время окончания — это время, которое когда-либо заканчивается позже (например. 1-е время окончания — 2p, 2-е время окончания — 2:01p, 2-е время окончания — это время окончания объединенного временного интервала).
  7. После запуска списка и объединения промежутков любое время, не охваченное промежутком, представляет неиспользованное время.

Комментарии:

1. @dah Вы бы изменили это, если бы вы были открыты с 2-10 (8 часов), а один пакет выполнялся с 2-4 (2 часа), а другой с 3-4 (1 час), тогда вы можете взять общее время открытия и вычесть время занятости: 8 — 3 = 5; в этом примере ничего не происходилов течение 5 часов. Анализ временных меток и суммирование времени должны быть довольно простой задачей.

Ответ №2:

Между этими двумя способами нет арифметической разницы. Сумма дельт временных меток между запусками и завершениями одного и того же события — это использованное время, затем вычитание этого из общего времени дает неиспользованное время. Или сумма дельт от времени завершения одного события до времени начала следующего события — это неиспользованное время, затем вычитание этого из общего времени дает используемое время. Ответ тот же.

Комментарии:

1. Вы правы, но мы говорим о двух машинах, на которых работают разные пакеты.

2. Я не понимаю, как это имеет какое-либо значение. Если это произойдет, это будет связано с тем, что измерение времени от окончания одного события на одной машине до начала события на другой машине недопустимо, что является аргументом в пользу того, что вы уже делаете.