2016-07-26 9 views
0

Я использую Rails 4.2.4. У меня есть ниже метод для преобразования времени (длительность) в миллисекундах ...Получение аргумента вне диапазона при попытке включить длительность в миллисекундах в Rails 4

Time.parse(convert_to_hrs(duration)).seconds_since_midnight * 1000 

, в котором метод «convert_to_hrs» определяется как

def convert_to_hrs(string) 
     case string.count(':') 
     when 0 
     '00:00:' + string.rjust(2, '0') 
     when 1 
     '00:' + string 
     else 
     string 
     end 
    end 

Однако, если продолжительность что-то действительно большой (например, «34:13:00» - читай: 34 часов, 13 минут и ноль секунд), выше завершается с ошибкой

Error during processing: argument out of range 
/Users/mikea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/time.rb:302:in `local' 
/Users/mikea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/time.rb:302:in `make_time' 
/Users/mikea/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/time.rb:366:in `parse' 
/Users/mikea/Documents/workspace/myproject/app/services/my_service.rb:25:in `block in process_page_data' 
/Users/mikea/Documents/workspace/myproject/app/services/my_service.rb:22:in `each' 
/Users/mikea/Documents/workspace/myproject/app/services/my_service.rb:22:in `process_page_data' 

Как переписать свою первую линию для точного преобразования длительности в милли секунд?

ответ

0

Если вы знаете, что вы всегда будете использовать часы: минуты: секунды, но число в каждом поле не гарантируется в пределах «нормального» диапазона (например, 0-23 в течение часа, 0 -59 за несколько минут, и т.д.), то вы, вероятно, лучше от делать это «вручную», используя что-то вроде этого:

def duration_in_milliseconds(input) 
    h, m, s = input.split(':').map(&:to_i) 
    (h.hours + m.minutes + s.seconds) * 1000 
end 

puts duration_in_milliseconds('34:13:00') #=> 123180000 

Обратите внимание, что это работает только с ActiveSupport, но у вас есть, что, так как вы указали Rails. Кроме того, предполагается, что вы всегда получаете все три условия (например, 5 секунд - 00:00:05). Полная настройка, которая принимает более короткие строки, также хотела бы использовать ваш метод convert_to_hrs.

Следует также отметить, что это работает, даже если форматирование не строго «время как», до тех пор, пока у вас есть последовательные колоны как: сепаратор обеспечивает

puts duration_in_milliseconds('1:1:5') #=> 3665000 

В Numeric#hours, Numeric#minutes and Numeric#seconds методах предоставляются ActiveSupport, как часть active_support/core-ext/time.rb. Они не особенно документированы, но они возвращают ActiveSupport::Duration объектов, которые имеют причудливые методы взаимодействия с проблемами времени и даты, такие как 5.days.ago, но при обработке как целое число фактически составляет несколько секунд.

0

Time.parse является ошибкой, потому что значения, которые вы передаете в duration, переменная находится за пределами допустимого диапазона.

Для Ex: Time.parse(convert_to_hrs('59:59')) согласно вашему письменному code, это вернуть 2016-07-27 00:59:59 +0530

Здесь значение 59:59 считает minutes:seconds, так что если вы передаете значение 60:60, то это поднимет ошибку argument out of range

Here является официальная документация по методу parse от Time

Надеюсь, это поможет вы.

+0

Я понимаю, почему ошибка случается, но я не понимаю, как написать инструкцию, которая будет правильно возвращать длительность в миллисекундах, учитывая указанное мной значение. Как мне это сделать? –

+0

Каково значение для 'duration'? – hgsongra

+0

Пойдите с примером в моем вопросе, который есть «44:09» –

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

  • Нет связанных вопросов^_^