2012-09-28 15 views
0

我在Rails中比较时间有点麻烦。我想检查一个事件是否在一个窗口内,如果有,事件或窗口从哪里开始,哪个以第一个结束。我的代码如下。Rails日期时间转换和时间比较

startingTime = 0 
endingTime = 0 
time = 0 

eventTimeStart = Time.parse(event.start.to_s) #Need to convert DateTime to just Time 
windowTimeStart = Time.parse(application.reportStart.to_s) 

eventTimeEnd = Time.parse(event.end.to_s) #Need to convert DateTime to just Time 
windowTimeEnd = Time.parse(application.reportEnd.to_s) 

days = 0 

if((windowTimeStart > eventTimeStart) || !(eventTimeStart < windowTimeEnd)) 
    startingTime = windowTimeStart 
    if((eventTimeStart > windowTimeEnd)) 
    days -= 1 
    end 
else 
    startingTime = eventTimeStart 
end 

if((windowTimeEnd > eventTimeEnd) && (eventTimeEnd > windowTimeStart)) 
    endingTime = eventTimeEnd 
else 
    if((eventTimeEnd < windowTimeStart)) 
    days -= 1 
    end 
    endingTime = windowTimeEnd 
end 

我已经手写了每种情况,但在运行时它似乎运行与预期不同。看起来好像我总是进入开放时代。 Rails对Times的使用方式不同于我的想法吗?你甚至可以用这种方式比较时间吗?

回答

0

感谢您的建议Mladen。

为了得到这个工作,我把所有的时间对象都传递给了我所做的将它们转换成分钟的方法。

def self.getMin(time) 
    return((time.hour*60) + time.min) 
end 

我在所有的支票上都打过电话,现在看起来可以工作。

if((getMin(windowTimeStart) > getMin(eventTimeStart)) || !(getMin(eventTimeStart) < getMin(windowTimeEnd))) 
    startingTime = windowTimeStart 
    if((getMin(eventTimeStart) > getMin(windowTimeEnd))) 
    days -= 1 
    end 
else 
    startingTime = eventTimeStart 
end 

我敢肯定有一个更好的方法来检查,但它现在工作。

1

如果你想看看是否间隔重叠与否,这个简单的检查就可以了:

overlaps = interval_1_start < interval_2_end && interval_1_end > interval_2_start 

我不明白这个问题的休息,但我只是希望你没有围绕您上面粘贴的代码的eventapplication两个大循环。