【问题标题】:How can I find the next "available" time slot Interval from a duration?如何从持续时间中找到下一个“可用”时隙间隔?
【发布时间】:2015-08-10 16:15:10
【问题描述】:

我有一个JodaTimeIntervals 的列表。这些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());
       }
   }
}

但是我不能使用Intervals,因为我需要找到符合用户标准的下一个可用间隔。如果我将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 的持续时间。我该怎么做?

【问题讨论】:

    标签: datetime jodatime intervals date-range


    【解决方案1】:

    问题是,你使用了错误的类;你想使用Duration。您要问的问题是:是否有 30 分钟的窗口可用。你不在乎它什么时候开始,只关心“它存在吗?”因此,请使用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;
        }
      }
    }
    

    【讨论】:

    • 哈哈,我刚刚切换到持续时间并修复了它!
    • 我将在我的实现中写一个答案供人们查看!你的回答也有效,所以我会接受。
    【解决方案2】:

    正如@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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2021-05-02
      相关资源
      最近更新 更多