+-
到目前为止,我已经尝试了...
start_hour = 7
start_minute = 0 * 0.01
end_hour = 17
end_minute = 45 * 0.01
step_time = 25
start_time = start_hour + start_minute
end_time = end_hour + end_minute
if step_time > 59
step_time = 1 if step_time == 60
step_time = 1.3 if step_time == 90
step_time = 2 if step_time == 120
else
step_time *= 0.01
end
hours = []
(start_time..end_time).step(step_time).map do |x|
next if (x-x.to_i) > 0.55
hours << '%0.2f' % x.round(2).to_s
end
puts hours
如果我输入步长间隔0,5,10,20,我可以得到我想要的时间间隔。但如果我输入15,25,90,我无法得到正确的范围。
1
投票
投票
你目前有。
end_hour = 17
end_minute = 45 * 0.01
end_time = end_hour + end_minute
#=> 17.45
虽然... 17.45
样子 像正确的值,它不是。45分钟是一小时的四分之三(或75%),所以正确的十进制值是 17.75
.
你可以相应地修改你的代码,但在使用 小数点后 是有点奇怪。只用分钟来计算就容易多了。与其把分钟变成小时,不如把小时变成分钟。
start_hour = 7
start_minute = 0
start_time = start_hour * 60 + start_minute
#=> 420
end_hour = 17
end_minute = 45
end_time = end_hour * 60 + end_minute
#=> 1065
总的分钟数可以很容易的通过 divmod
:
420.divmod(60) #=> [7, 0]
1065.divmod(60) #=> [17, 45]
利用上述方法,我们可以在不需要转换步距的情况下遍历范围。
def hours(start_time, end_time, step_time)
(start_time..end_time).step(step_time).map do |x|
'%02d:%02d' % x.divmod(60)
end
end
hours(start_time, end_time, 25)
#=> ["07:00", "07:25", "07:50", "08:15", "08:40", "09:05", "09:30", "09:55",
# "10:20", "10:45", "11:10", "11:35", "12:00", "12:25", "12:50", "13:15",
# "13:40", "14:05", "14:30", "14:55", "15:20", "15:45", "16:10", "16:35",
# "17:00", "17:25"]
hours(start_time, end_time, 90)
#=> ["07:00", "08:30", "10:00", "11:30", "13:00", "14:30", "16:00", "17:30"]