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
Это более или менее то, что вы говорите, что делает ваш код. Я не думаю, что это может быть намного чище.