如何测试两个时间段是否重叠?

7
我需要在Rails应用程序中实现预订功能,并确保预订不重叠。尽管cover?between?方法不太适合我的需求,但我必须确保与同一模型上的其他潜在范围相比较的时间范围的唯一性,并且要高效地完成这个任务。我认为可以使用overlaps?来解决这个问题。但问题是,对于像这样的情况,它会返回TRUE:
(1..5).overlaps?(5..9)
=> true

如果我比较一个预订在另一个预订结束时刚好开始的情况(3:30 - 4:00对比4:00 - 4:30),它会说它们重叠,但从技术上讲它们实际上不重叠。那将是一个问题,对吗?
看起来ValidatesOverlap可以解决这个问题,包括边缘重叠。
有什么建议吗?

检查一下是否有一个范围覆盖了另一个范围的端点。 - Amit Kumar Gupta
需要将其转换为包括毫秒的时间对象。我认为。 - Arup Rakshit
1
发现了这个宝石:https://github.com/robinbortlik/validates_overlap,似乎可以处理包括重叠边缘在内的 Rails 问题。 - John Trichereau
2个回答

11

1
另一个技巧行不通,因为浮点数很奇怪。 :) irb(main):048:0> (1..5-2*Float::EPSILON).overlaps?(5..9) => true irb(main):049:0> (1..5-3*Float::EPSILON).overlaps?(5..9) => false - Robert Krzyzanowski
这可能应该是(x.first - y.end) * (y.first - x.end) >= 0,否则日期将不能与自身重叠。 - Johnny
@Johnny 不,OP特别要求一个日期不重叠的情况。 - jazzpi

6
对于您的情况,为什么我们需要包括结束时间呢?毕竟,预订在那个时间结束,而时间段从那个时间开始可用。因此,下面应该是有意义的。 (1...5).overlaps?(5...9)

这应该是这里的最佳答案。这对我很有帮助。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接