Шаг 1: Получите все свои даты (в виде целых чисел) в отсортированный (по времени) двумерный массив, отметив, является ли каждая дата началом или окончанием таймфрейма. Например:
array = [[1484715564, 'start'], [1484715565, 'start'], [1484715569, 'end'], [1484715587, 'end'], ...]
Тогда все, что вам нужно сделать, это следить, выполнили ли вы через столько end
с, как start
с, и если у вас есть, сделать это к сведению!
num_starts = 0
gap_start = 0
gaps = []
array.each do |date, which_end|
if which_end == 'start'
num_starts += 1
if num_starts == 1
gaps << [gap_start, date]
end
else
num_starts -= 1
if num_starts == 0
gap_start = date
end
end
end
Не могли бы вы просто повторить эти дни/часы, а затем сохранить свободное время в массиве? –
Да, но я не совсем уверен, как проверить перекрытие, поскольку я использую диапазоны дат? – trowse