Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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 Ruby时间和范围包括/排除_Ruby On Rails_Ruby_Ruby On Rails 3_Time_Activesupport - Fatal编程技术网

Ruby on rails Ruby时间和范围包括/排除

Ruby on rails Ruby时间和范围包括/排除,ruby-on-rails,ruby,ruby-on-rails-3,time,activesupport,Ruby On Rails,Ruby,Ruby On Rails 3,Time,Activesupport,现在我有一个助手方法,它查看一个相对的时间范围,以确定您当前正在吃什么饭 def calculate_meal(time) # Evening snack from midnight to 2:00am # Morning Snack from 2:00:01am to 6:00am # Breakfast 6:00:01am to 11:00 am # Lunch 11:00:01am to 4:00pm # Dinner 4:00:01 pm to 10:00pm # Evening S

现在我有一个助手方法,它查看一个相对的时间范围,以确定您当前正在吃什么饭

def calculate_meal(time)

# Evening snack from midnight to 2:00am
# Morning Snack from 2:00:01am to 6:00am
# Breakfast 6:00:01am to 11:00 am
# Lunch 11:00:01am to 4:00pm
# Dinner  4:00:01 pm to 10:00pm
# Evening Snack 10:00:01pm to midnight
millisecond = 1
second = 1000
minute = 60*second
hour = 60*minute

if time.is_a? Hash

  time_hour     = time[:hour]
  time_minutes  = time[:minute]
  #time_sec      = time.sec
  #time_millisec = time.strftime("%L").to_i
  total_time = ((time_hour*60+time_minutes)*60)*second

elsif [ActiveSupport::TimeWithZone,Time].include? time.class

  time_hour     = time.hour
  time_minutes  = time.min
  time_sec      = time.sec
  time_millisec = time.strftime("%L").to_i
  total_time = ((time_hour*60+time_minutes)*60+time_sec)*second+time_millisec

end

puts total_time
case total_time
when 0..(hour*2)
  return :evening_snack
when ((hour*2+millisecond)..(6*hour))
  return :morning_snack
when ((6*hour+millisecond)..(11*hour))
  return :breakfast
when ((11*hour+millisecond)..(16*hour))
  return :lunch
when ((16*hour+millisecond)..(22*hour))
  return :dinner
when ((22*hour+millisecond)..(24*hour))
  return :evening_snack
end
end

我目前正在将范围划分为毫秒,但是有没有更好的方法来使用Ruby中处理时间的包含/排除范围,以便覆盖所有时间和案例,而不是像现在这样有漏洞?

您可以使用
..
排除终点,但包括起点。因此,大致如下:

def calculate_interval(point)
  case point
  when 0...10
    "first"
  when 10...20
    "second"
  else
    "third"
  end
end

calculate_interval(0)  # => "first"
calculate_interval(5)  # => "first"
calculate_interval(10) # => "second"
calculate_interval(20) # => "third"
在您的特定情况下,您应该能够执行以下操作:

case total_time
when 0...(hour*2)
  return :evening_snack
when ((hour*2)...(6*hour))
  return :morning_snack
when ((6*hour)...(11*hour))
  return :breakfast
when ((11*hour)...(16*hour))
  return :lunch
when ((16*hour)...(22*hour))
  return :dinner
when ((22*hour)..(24*hour)) # inclusive range depending on how you want to handle midnight
  return :evening_snack
end
end
只需将
替换为
就可以了

另外,如果您有权访问
ActiveSupport::Time
,那么您应该有权访问实例方法,该方法返回时间对象午夜后的秒数。这将简化许多初始计算

比如说,

Time.now.seconds_since_midnight # => 67595.181868

它有助于了解seconds_since_midnight函数如何考虑时间对象的时区偏移。