Как я могу создать определенный интервал времени c в Ruby? - PullRequest
1 голос
/ 07 мая 2020

То, что я пробовал до сих пор ...

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 Ответ

1 голос
/ 07 мая 2020

В настоящее время у вас есть:

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...