我正在使用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。
答案 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