2016-07-26 1 views
0

Rails 4.2.4を使用しています。期間は本当に大きな何かがある場合、私は、その方法「convert_to_hrsは」 Rails 4でデュレーションをミリ秒にするときに「引数が範囲外です」

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

しかし

として定義されて

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

ミリ秒までの時間(期間)を変換するため、以下の方法を...持っている(たとえば、 「34:13:00」 - 読み:34時間、13分、と0秒)を、上記の

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)、あなたはおそらくこのような何か使用して「手動」それをやってオフに最善だ:これが唯一のactivesupportので動作しますが、あなたが指定したことから、ということがあること

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 

注意をRails。また、これは、3つの用語すべてが常に得られていることを前提としています(たとえば、5秒は00:00:05です)。より短い文字列を受け入れる完全な設定でも、convert_to_hrsメソッドを使用したいと考えています。

も注意してください、これはフォーマットは限り、あなたはseperatorsとして一貫性のあるコロンを持っているように、厳密に「時間様」でない場合でも動作すること:

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

Numeric#hours, Numeric#minutes and Numeric#seconds方法はの一部として、activesupportのによって提供されていますactive_support/core-ext/time.rb。特に文書化されていませんが、5.days.agoのような時間と日付の問題と対話するための巧妙な方法を持つActiveSupport::Durationオブジェクトを返しますが、整数として扱うと効果的に数秒です。

0

Time.parseは、durationの変数を渡す値が範囲外であるため、スローエラーです。例については

:あなたの書かれたcodeどおり Time.parse(convert_to_hrs('59:59'))が、それはあなたが値60:60を渡した場合、それはエラーにargument out of range

Hereが発生しますので、ここで59:59minutes:secondsとして考える価値を2016-07-27 00:59:59 +0530

を返しますされますparseの公式文書Time

希望するこれは役に立ちます君は。

+0

私はエラーが起きている理由を理解していますが、リストされた値が与えられているミリ秒単位で持続時間を正しく返すステートメントを作成する方法を理解できません。どうやってタットをするの? –

+0

'duration'の値は何ですか? – hgsongra

+0

"44:09" –

関連する問題