关于时间间隔的C ++算术

时间:2013-09-27 12:55:41

标签: c++ boost-date-time boost-icl

我已经为此工作(丑陋)代码,但无论如何我会问:

我在工作日有[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 个答案:

答案 0 :(得分:2)

我认为这个问题太复杂了,不允许使用 clean 解决方案,至少根据我对“干净”的定义。

您需要一个容器来处理(非重叠)每日间隔,以便有效地支持以下操作:

  • 查找给定时间属于哪个特定时间间隔,
  • 在容器中向后移动一个间隔,
  • 移动到最后一个间隔(按时间顺序)。

在我看来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

这或多或少是您所说的代码所做的。我认为它不会更清洁。