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::d ate_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

这或多或少是你所说的代码所做的。 我认为它不能更干净。

相关内容

  • 没有找到相关文章

最新更新