+-
如何在Ruby中创建一个特定的时间间隔?

到目前为止,我已经尝试了...

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"]