我有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分钟时段。但是,此算法不起作用,因为间隔仅检查start
和end
次是否在包含间隔的start
和end
次之间。
示例:
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
的持续时间。我怎么能这样做?
答案 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);
}