【问题标题】:Getting "argument out of range" when trying to turn a duration into milliseconds in Rails 4尝试在 Rails 4 中将持续时间转换为毫秒时出现“参数超出范围”
【发布时间】:2016-07-26 20:30:24
【问题描述】:

我使用的是 Rails 4.2.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'

如何重写我的第一行以准确地将持续时间转换为毫秒?

【问题讨论】:

    标签: parsing ruby-on-rails-4 time duration


    【解决方案1】:

    如果您知道您将始终使用小时:分钟:秒格式,但不能保证每个字段中的数字都在“正常”范围内(例如,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 等时间和日期问题交互的奇特方法,但当被视为整数时,实际上是几秒。

    【讨论】:

      【解决方案2】:

      Time.parse 抛出错误,因为您传入的值 duration 变量超出范围。

      例如: 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

      HereTimeparse方法的官方文档

      希望这会对你有所帮助。

      【讨论】:

      • 我明白为什么会发生错误,但我不明白如何编写一个语句,根据我列出的值正确返回持续时间(以毫秒为单位)。我该怎么做?
      • duration 的值是多少?
      • 继续我的问题中的示例,即“44:09”
      • 我已经尝试过了,它正在工作,结果是2.2.2 :015 > Time.parse(convert_to_hrs("44:09")).seconds_since_midnight * 1000 => 2649000.0
      • 如果您将44:09 替换为60:00,则会引发错误ArgumentError: argument out of range,正如我所解释的那样
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多