1

私はすでにこのための(醜い)コードを持っていますが、とにかく尋ねます:

平日は [09:15, 10:00), [21:10, 21:45) の時間間隔があります。指定された時間tと秒数が間隔内にあるs場合、日付と時刻を計算する必要があります。tt - 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 日または週末全体に戻る必要があるかどうかを検出する方法。

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 に答える