可以检测重叠的时间跨度

时间:2013-12-16 19:00:55

标签: ruby ruby-on-rails-4

我正在使用Rails并且希望能够描述“时间跨度”,包括开始时间和持续时间(也包括日期)。我希望能够轻松测试两个时间跨度是否有任何交集。我想象这样的事情:

d1 = TimeSpan.new("1-1-2014 10 AM", 1.hour)
d2 = TimeSpan.new("1-1-2014 10:30 AM", 1.hour + 30.minutes)
d3 = TimeSpan.new("1-1-2014 12:00 PM", 1.hour)
d1 | d2 # true
d2 | d3 # false

我是新手,并且没有太多的运气搜索图书馆 - 这样的事情已经存在了吗?如果没有,任何有关写作课程的最佳方法的提示都会受到赞赏。谢谢!

更新

根据以下答案,我提出了这个问题:

require 'active_support/all'

class TimeSpan
  attr_accessor :start_time, :duration, :time_range
  def initialize(start_time, duration)
    @start_time = DateTime.parse(start_time)
    @duration = duration
    @time_range = (@start_time..@start_time + @duration)
  end
  def |(other)
    @time_range.overlaps? other.time_range
  end
end


d1 = TimeSpan.new("1-1-2014 10 AM", 1.hour)
d2 = TimeSpan.new("1-1-2014 10:30 AM", 1.hour + 30.minutes)
d3 = TimeSpan.new("1-1-2014 12:01 PM", 1.hour)
p d1 | d2 # true
p d2 | d3 # false

赞赏任何进一步的改进。我正在考虑的一件事是是否从@time_range减去一分钟,以便没有重叠,例如10 AM + 2.hours和12 PM + 1.hour。

2 个答案:

答案 0 :(得分:1)

Range有一个方法cover,可以做你需要的。

early_date = Time.now
later_date = early_date + 1.hour
middle_date = early_date + 30.minutes
outer_date = later_date + 1.minute

range = early_date..later_date
range.cover?(later_date) # true
range.cover?(outer_date) # false

答案 1 :(得分:0)

您可以使用DateTime范围和ActiveSupport的{​​{3}}方法:

t1 = DateTime.parse("1-1-2014 12:00 AM") #=> Wed, 01 Jan 2014 10:00:00 +0000
d1 = (t1..t1+1.hour)                     #=> Wed, 01 Jan 2014 10:00:00 +0000..Wed, 01 Jan 2014 11:00:00 +0000

t2 = DateTime.parse("1-1-2014 10:30 AM") #=> Wed, 01 Jan 2014 10:30:00 +0000
d2 = (t2..t2+1.hour+30.minutes)          #=> Wed, 01 Jan 2014 10:30:00 +0000..Wed, 01 Jan 2014 12:00:00 +0000

t3 = DateTime.parse("1-1-2014 12:00 PM") #=> Wed, 01 Jan 2014 12:00:00 +0000
d3 = (t3..t3+1.hour)                     #=> Wed, 01 Jan 2014 12:00:00 +0000..Wed, 01 Jan 2014 13:00:00 +0000

d1.overlaps? d2  #=> true
d1.overlaps? d3  #=> false