1

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

我在工作日有时间间隔 [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,它当然可以将时间范围保存在an中interval_set<Time>并找到某个区间Time,但是如果t - s时间点不属于区间范围,我不知道如何找到最近的区间在那个时间点之前,以及如何检测我是否必须回去一天或整个周末。

4

1 回答 1

2

我认为这个问题太复杂了,无法提供一个干净的解决方案,至少根据我对“干净”的定义。

您需要一个用于(非重叠)每日间隔的容器,有效地支持以下操作:

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

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

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

于 2013-09-27T13:32:53.397 回答