C ++ арифметика на временных интервалах

У меня уже есть рабочий (некрасивый) код для этого, но я все равно спрошу:

У меня есть временные интервалы [09:15, 10:00), [21:10, 21:45) в будние дни. Данное время t и количество секунд s, если t в пределах интервалов, я должен рассчитать дату и время, когда t - s попадет в.

  • Пример: t = 20130913 21:15, s = 600, t — s попадает в 20130913 09:55.
  • Пример: t = 20130923 09:16, s = 120, t — s попадает в 20130920 21:44.

Есть ли способ сделать это в C ++ чисто (boost :: icl? Boost :: date_time?)

Я пробовал boost :: icl, он, безусловно, может содержать временные диапазоны в interval_set<Time> и найти, какой интервал определенного Time в, но если t - s момент времени не попадает в интервал интервалов, я не вижу, как найти ближайший интервал до этого интервала времени и как определить, нужно ли мне возвращаться на день или на все выходные.

1

Решение

Я думаю, что проблема слишком сложна, чтобы учесть чистый Решение, по крайней мере, в соответствии с моим определением «чистый».

Вам понадобится контейнер для ваших (не перекрывающихся) ежедневных интервалов, обеспечивающий эффективную поддержку следующих операций:

  • найти, к какому конкретному интервалу относится данное время,
  • переместить интервал назад в контейнере и
  • перейти к последнему интервалу (в хронологическом порядке).

Мне кажется, что 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

Это более или менее то, что вы говорите, что делает ваш код. Я не думаю, что это может быть намного чище.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]