В настоящее время у вас есть:
end_hour = 17
end_minute = 45 * 0.01
end_time = end_hour + end_minute
#=> 17.45
Хотя 17.45
выглядит как правильное значение, это не так. 45 минут - это 3 четверти (или 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"]