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函数如何考虑时间对象的时区偏移。