2014-12-07 3 views
1

Следующее задание: мне нужно получить минуты между одним и другим: например, между «8:15» и «7:45». У меня есть следующий код:Вычитание времени в рубине

(Time.parse("8:15") - Time.parse("7:45")).minute 

Но я получаю результат как «108000,0 секунд».

Как это исправить?

ответ

1

Вычитание времени возвращает значение в секундах. Таким образом, разделить на 60, чтобы получить ответ в течение нескольких минут:

=> (Time.parse("8:15") - Time.parse("7:45"))/60 
#> 30.0 
+0

Как временный код паранойи, здесь есть некоторые ошибки, которые нужно знать: этот код не будет работать через границы дня, например. 00:01 - 23:59. Он может выйти из строя, если код запускается в полночь - он может анализировать первый раз в последнюю миллисекунду понедельника и второй раз, например, во время первой миллисекунды вторника. Вероятно, это проявит странное поведение в некоторых временных диапазонах в дни, когда изменяется переход на летнее время. –

3

В результате вы получите обратно с плавающей точкой числа секунд не является объектом времени. Таким образом, чтобы получить количество минут и секунд между двумя моментами:

require 'time' 
t1 = Time.parse("8:15") 
t2 = Time.parse("7:45") 
total_seconds = (t1 - t2) # => 1800.0 

minutes = (total_seconds/60).floor # => 30 
seconds = total_seconds.to_i % 60 # => 0 

puts "difference is #{minutes} minute(s) and #{seconds} second(s)" 

Использование floor и модуль (%) позволяет разделить минуты и секунды, так что это более читаемым человеком, нежели с «6,57 минут»

1

Вы можете избежать странного разбора партирования getchas (переход на летнее время, запуск кода около полуночи), просто выполнив математику по часам и минутам вместо того, чтобы разбирать их на объекты Time. Что-то вдоль этих линий (я бы проверить математику с тестами):

one = "8:15" 
two = "7:45" 
h1, m1 = one.split(":").map(&:to_i) 
h2, m2 = two.split(":").map(&:to_i) 
puts (h1 - h2) * 60 + m1 - m2 

Если вы хотите принять Daylight Saving во внимание (например, вы иногда хотите добавлен дополнительный час или вычитаться в зависимости от текущей даты), то вам конечно, нужно будет задействовать Time.

Смежные вопросы