【问题标题】:Ruby, get hours, seconds and time from Date.day_fraction_to_timeRuby,从 Date.day_fraction_to_time 获取小时、秒和时间
【发布时间】:2011-04-13 11:41:35
【问题描述】:

我找到了这个方法here

  start = DateTime.now
  sleep 15
  stop = DateTime.now
  #minutes
  puts ((stop-start) * 24 * 60).to_i

  hours,minutes,seconds,frac = Date.day_fraction_to_time(stop-start)

我有以下错误:

`<main>': private method `day_fraction_to_time' called for Date:Class (NoMethodError)

我检查了 /usr/lib/ruby/1.9.1/date.rb 并找到了它:

def day_fraction_to_time(fr) # :nodoc:
  ss,  fr = fr.divmod(SECONDS_IN_DAY) # 4p
  h,   ss = ss.divmod(3600)
  min, s  = ss.divmod(60)
  return h, min, s, fr * 86400
end

但是如果我用ruby1.8运行它就没有问题。 /usr/lib/ruby/1.8/date.rb 给了我:

  def self.day_fraction_to_time(fr)
    ss,  fr = fr.divmod(SECONDS_IN_DAY) # 4p
    h,   ss = ss.divmod(3600)
    min, s  = ss.divmod(60)
    return h, min, s, fr
  end

所以我去看了documentation(1.9),并没有这种方法的踪迹。我知道这是一个愚蠢的问题,但他们为什么要删除它? /usr/lib/ruby/1.9.1/date.rb中甚至还有这个方法的使用示例:

 def secs_to_new_year(now = DateTime::now())
     new_year = DateTime.new(now.year + 1, 1, 1)
     dif = new_year - now
     hours, mins, secs, ignore_fractions = Date::day_fraction_to_time(dif)
     return hours * 60 * 60 + mins * 60 + secs
 end

但我仍然收到错误:

test.rb:24:in `secs_to_new_year': private method `day_fraction_to_time' called for Date:Class (NoMethodError)
    from test.rb:28:in `<main>'

【问题讨论】:

    标签: ruby datetime comparison method-missing


    【解决方案1】:

    我不知道为什么它被设为私有,但你仍然可以访问它:

    hours,minutes,seconds,frac = Date.send(:day_fraction_to_time, stop-start)
    

    通过这种方式,您可以覆盖 OOP 封装机制...这不是一件好事,但它确实有效。

    【讨论】:

    • 没错。我正在打破 OOP 结构,太烦人了。不是__send__吗?
    【解决方案2】:

    我发现了另一种对我来说似乎更优雅的方法:

    start = DateTime.now
    sleep 3
    stop = DateTime.now
    
    puts "Date.day_fraction_to_time using wrapper"
    class Date
        class << self
          def wrap_day_fraction_to_time( day_frac )
            day_fraction_to_time( day_frac )
          end
       end
    end
    hours, minutes, seconds, frac =
        Date.wrap_day_fraction_to_time( stop - start )
    p hours, minutes, seconds, frac
    

    感谢 ruby-forum.com 的 Colin Bartlett

    要了解它的工作原理,我建议阅读 David Seiler 的 answer

    【讨论】:

    • 这实际上在某种程度上更优雅,但另一方面 - 猴子修补内置类也是被视为“坏习惯”的事情......
    • 是的,但现在我没有想法。我的意思是我当然可以从头开始编写一个函数,但它让我烦恼的是一个方法可用但我不能使用它。
    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2021-06-06
    • 1970-01-01
    • 2012-02-12
    • 2014-07-11
    • 2016-09-22
    • 2014-10-17
    • 2020-11-21
    相关资源
    最近更新 更多