Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails 3.1测试时间对象是否在字符串时间范围内_Ruby On Rails 3_Datetime - Fatal编程技术网

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