如何从持续时间中找到下一个“可用”时间间隔?

时间:2015-08-10 16:15:10

标签: datetime jodatime intervals date-range

我有JodaTime Intervals的列表。这些Intervals包含以下时间规范:

(在军事时间)

00:00:00 - 10:00:00 
11:30:00 - 15:00:00 (3:00:00 PM)
15:30:00 - 23:59:59 (11:59:59 PM).

我的问题是我想使用用户的Interval抽象来检测哪个时段符合用户所需的时间间隔。

例如,使用此代码我计算:

optimizeIntervals(generateMeetingIntervals());
generateBetweenIntervals();
ArrayList<Interval> during = getMeetingDuringIntervals();
ArrayList<Interval> between = getMeetingBetweenIntervals();
Interval desiredDuration = new Interval(now,now.plusMinutes(requestedDuration));

for(int i = 0; i<between.size();i++){
   Interval current = between.get(i);
   if(current.getEnd().isAfter(now)){
       if (current.contains(testing)){
           setNextAvailableStart(now);
           setNextAvailableEnd(current.getEnd());
       }
   }
}

但我无法使用Interval,因为我需要找到符合用户标准的下一个可用时间间隔如果Interval使用desiredDuration意味着,如果用户想要一个“15分钟长”的时间段,我希望算法找到下一个可用的15分钟时段。但是,此算法不起作用,因为间隔仅检查startend次是否在包含间隔的startend次之间。

示例:

now = 10:30 AM
desiredDuration = 30 minutes

desiredDuration计算为10:30 AM to 11:00 AM

的间隔

循环运行:

10:30 AM to 11:00 AM中包含00:00:00 to 10:00:00? - 没有

10:30 AM to 11:00 AM中包含11:30:00 to 15:00:00? - 没有应该是

然而,在第二次检查时,我想看看在该时间范围内是否有30 minutes的持续时间。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

问题是,你使用的是错误的类;你想使用Duration。你问的问题是:是否有30分钟的窗口可用。你什么时候开始关心,只是&#34;它存在吗?&#34;因此,请使用Duration,它没有开始时间或结束时间的概念。

请注意,您仍然使用if(current.getEnd().isAfter(now)) 来回答时间间隔是否在当前时间段之后。

因此,检查每个时段,生成可能的拟合,确保它足够长,然后保存它,如果它工作。这是一些代码:

Duration desiredDuration = new Duration(requestedDuration);

Interval validDuration = null;
for(int i = 0; i<between.size();i++) {
  Interval current = between.get(i);
  if(current.getEnd().isAfter(now)) {
    Interval candidateDuration = current.withDurationAfterStart(desiredDuration);
    if(current.contains(candidateDuration)) {
      validDuration = candidateDuration;
      break;
    }
  }
}

答案 1 :(得分:0)

正如@ durron597所说,我的问题是使用Interval而不是Duration。以下是我的实现:

  this.meetingData = testMeetingData;
    availableNow = false;
    DateTime now = caseToTest;

    //Calculate range abstractions and optimize them.
    optimizeIntervals(generateMeetingIntervals());
    generateBetweenIntervals();
    ArrayList<Interval> during = getMeetingDuringIntervals();
    ArrayList<Interval> between = getMeetingBetweenIntervals();
    Interval testing = new Interval(now, now.plusMinutes(requestedDuration));


    if (testMeetingData.size()>0) {
        for (int i = 0; i < between.size(); i++) {
            Interval current = between.get(i);
            if (!current.getEnd().isBefore(now) && !current.getEnd().isEqual(now)) {
                if (current.toDuration().isLongerThan(testing.toDuration())) {
                    setNextAvailableStart(current.getStart());
                    setNextAvailableEnd(current.getEnd());
                    if (current.contains(testing)) {
                        setNextAvailableStart(now);
                        setAvailableNow(true);
                    }
                    break;
                }
            }
        }
    }
    else{
        setNextAvailableStart(new DateTime().withTimeAtStartOfDay());
        setNextAvailableEnd(new DateTime().withTime(23,59,59,999));
        setAvailableNow(true);
    }