У меня уже есть рабочий (некрасивый) код для этого, но я все равно спрошу:
У меня есть временные интервалы [09:15, 10:00), [21:10, 21:45) в будние дни. Данное время t
и количество секунд s
, если t
в пределах интервалов, я должен рассчитать дату и время, когда t - s
попадет в.
Есть ли способ сделать это в C ++ чисто (boost :: icl? Boost :: date_time?)
Я пробовал boost :: icl, он, безусловно, может содержать временные диапазоны в interval_set<Time>
и найти, какой интервал определенного Time
в, но если t - s
момент времени не попадает в интервал интервалов, я не вижу, как найти ближайший интервал до этого интервала времени и как определить, нужно ли мне возвращаться на день или на все выходные.
Я думаю, что проблема слишком сложна, чтобы учесть чистый Решение, по крайней мере, в соответствии с моим определением «чистый».
Вам понадобится контейнер для ваших (не перекрывающихся) ежедневных интервалов, обеспечивающий эффективную поддержку следующих операций:
Мне кажется, что boost::icl::interval_set<Time>
это адекватное решение. Ваше время не нужно отслеживать дату, вы можете иметь это отдельно.
Ваш алгоритм будет примерно таким:
let d and t be the date and time portions of your t
let i be the interval where t belongs
loop
if t-s belongs in i then
return t-s on day d
else
let j be the previous interval from i
if j does not exist (because i was the first) then
let j be the last interval
move d one weekday backwards
s := s - (t-start(i))
t := end(j)
i := j
Это более или менее то, что вы говорите, что делает ваш код. Я не думаю, что это может быть намного чище.
Других решений пока нет …