有以下几种情况:
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。我究竟做错了什么?我该如何解决?谢谢。
答案 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)
您的约会时间(现在)不在开始和结束时间之间