如何使用Rails检查时间是否在范围内

时间:2014-01-24 12:43:19

标签: ruby-on-rails

有以下几种情况:

   now =  "2014-01-24T15:58:07.169+04:00",
   start = "2000-01-01T10:00:00Z",
   end = "2000-01-01T16:00:00Z"

我需要检查现在是否在开始和结束之间。我使用以下代码:

Range.new(start, end).cover?(now)

不幸的是,此代码对我的数据返回false。我究竟做错了什么?我该如何解决?谢谢。

4 个答案:

答案 0 :(得分:1)

好吧,我会使用between?方法。因为它比cover?include?变体更快。这是一个例子:

yesterday = Date.yesterday
today = Date.today
tomorrow = Date.tomorrow

today.between?(yesterday, tomorrow) #=> true

以下是性能测试的要点Include?, Cover? or Between?

<强>更新

根据您最近的评论,您想比较没有日期的“唯一时间”。如果我找到你,你就有办法 - strftime。但在此之前,为了正确比较,您需要将所有日期时间转换为单个时区(例如,使用utc)。这是一个例子:

start_time_with_date = Time.parse('2000-01-01T16:00:00Z').utc
end_time_with_date = Time.parse('2014-01-24T15:58:07.169+04:00').utc


start_time = start_time_with_date.strftime('%I:%M:%S') #=> '04:00:00'
end_time = end_time_with_date.strftime('%I:%M:%S') #=> '11:58:07'

current_time = Time.now.utc.strftime('%I:%M:%S') #=> '01:45:27' (my current time)

current_time.between?(start_time, end_time) #=> false

是的。可悲的是,这是一个字符串比较。

答案 1 :(得分:0)

您可以将Range#cover?与时间对象一起使用。

start = Time.parse('2000-01-01T10:00:00Z')
end_time = Time.parse('2000-01-01T16:00:00Z')
now = Time.parse('2014-01-24T15:58:07.169+04:00')

(start..end_time).cover?(now)

你现在正在使用字符串,Ruby无法知道你在谈论时间。

答案 2 :(得分:0)

我看到唯一的变体,为Range定义其他方法:

class Range
   def time_cover? now
      (b,e,n) = [ self.begin.utc.strftime( "%H%M%S%N" ),
                  self.end.utc.strftime( "%H%M%S%N" ),
                  now.utc.strftime( "%H%M%S%N" ) ]
      if b < e 
        b <= n && e >= n
      else
        e <= n && b >= n
      end
   end
end

now =  Time.parse "2014-01-24T15:58:07.169+04:00"
s = Time.parse "2000-01-01T10:00:00Z"
e = Time.parse "2000-01-01T16:00:00Z"

Range.new(s, e).time_cover?(now)
# => true

答案 3 :(得分:0)

您的约会时间(现在)不在开始和结束时间之间