Ruby on rails 3 Rails 3.1测试时间对象是否在字符串时间范围内
指示时间范围的参数字符串Ruby on rails 3 Rails 3.1测试时间对象是否在字符串时间范围内,ruby-on-rails-3,datetime,Ruby On Rails 3,Datetime,指示时间范围的参数字符串 sched = "8:00AM-5:30PM" 我的数据库中存储了开始和结束时间 client1.sched_start # => 2000-01-01 07:30:00 UTC client1.sched_end # => 2000-01-01 17:30:00 UTC client2.sched_start # => 2000-01-01 08:30:00 UTC client2.sched_end # =>
sched = "8:00AM-5:30PM"
我的数据库中存储了开始和结束时间
client1.sched_start # => 2000-01-01 07:30:00 UTC
client1.sched_end # => 2000-01-01 17:30:00 UTC
client2.sched_start # => 2000-01-01 08:30:00 UTC
client2.sched_end # => 2000-01-01 16:30:00 UTC
如何测试客户端时间范围是否在计划的小时范围内,返回true或false
到目前为止,我已经做到了这一点,但我总是得到正确的答案,而且它的速度非常慢
time_open = Time.use_zone('UTC'){Time.zone.parse '2000-01-01 '+sched.split("-")[0]}
time_close = Time.use_zone('UTC'){Time.zone.parse '2000-01-01 '+sched.split("-")[1]}
range = time_open..time_close
range === client1.sched_start && range === client1.sched_end
range === client2.sched_start && range === client2.sched_end
以下是警告的摘录
warning: Time#succ is obsolete; use time + 1
而且,时间是不同的格式。比如说,
time_open # Sat, 01 Jan 2000 08:00:00 UTC 00:00
到目前为止,这些都是有帮助的:
>> time_open = Time.use_zone('UTC'){Time.zone.parse '2000-01-01 ' + "8:00AM"}
=> Sat, 01 Jan 2000 08:00:00 UTC +00:00
让我们将client1.sched_start
(我将其称为scheduled_time
)转换为一个时间对象(如果client1.sched_start
已经是一个时间对象,则可能不需要此步骤,请检查client1.sched_start.class
)
time\u open
和scheduled\u time
不相等:
>> time_open == scheduled_time
=> false
如果我们将time\u open
与同一时间进行比较,它将相等:
>> correct_start = Time.parse('2000-01-01 08:00:00 UTC')
=> 2000-01-01 08:00:00 UTC
>> time_open == correct_start
=> true
- 编辑-如何检查时间是否在范围内*
运算符检查时间是否在某个范围内更为清晰:
>> start_time = Time.new(2013, 7, 29, 10)
=> 2013-07-29 10:00:00 -0400
>> end_time = Time.new(2013, 7, 29, 16)
=> 2013-07-29 16:00:00 -0400
>> subject_time = Time.new(2013, 7, 29, 14)
=> 2013-07-29 14:00:00 -0400
>> subject_time > start_time && subject_time < end_time
=> true
>start\u time=time.new(2013,7,29,10)
=> 2013-07-29 10:00:00 -0400
>>结束时间=新时间(2013,7,29,16)
=> 2013-07-29 16:00:00 -0400
>>受试者时间=新时间(2013,7,29,14)
=> 2013-07-29 14:00:00 -0400
>>主题时间>开始时间和主题时间<结束时间
=>正确
感谢您的回复。这解释了为什么时间显示为不同的时间格式。当我打开time\u open.class
时,我得到了ActiveSupport::TimeWithZone
。因此,我将打开/关闭时间更改为time\u open=time.parse(“2000-01-01 08:00AM”+“UTC”)
,现在它们都是time
类。但当我继续做一个时间范围,然后看看我的时间对象是否在这个范围内。我犯了一个错误<代码>类型错误:无法从时间迭代@JHo-我更新了我的答案,以显示我认为您应该如何检查时间是否在时间范围内。请让我知道这是否适合你!我喜欢这个解决方案。它适用于任意日期,并可轻松转换字符串。这一参考也很有用:
>> start_time = Time.new(2013, 7, 29, 10)
=> 2013-07-29 10:00:00 -0400
>> end_time = Time.new(2013, 7, 29, 16)
=> 2013-07-29 16:00:00 -0400
>> subject_time = Time.new(2013, 7, 29, 14)
=> 2013-07-29 14:00:00 -0400
>> subject_time > start_time && subject_time < end_time
=> true