7 Stimmen

Ruby, liefert Stunden, Sekunden und Zeit aus Date.day_fraction_to_time

Ich habe diese Methode gefunden ici .

  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)

Ich habe den folgenden Fehler:

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

Ich habe geprüft /usr/lib/ruby/1.9.1/date.rb und ich habe sie gefunden:

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

Aber ich habe kein Problem, wenn ich es mit ruby1.8 laufen lasse. /usr/lib/ruby/1.8/date.rb gibt mir:

  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

Also habe ich mir die Dokumentation(1.9) und von dieser Methode gibt es keine Spur. Ich weiß, es ist eine dumme Frage, aber warum haben sie sie entfernt? Es gibt sogar ein Beispiel für die Verwendung der Methode in /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

aber ich erhalte immer noch die Fehlermeldung:

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>'

3voto

apirogov Punkte 1276

Ich weiß nicht, warum sie privat gemacht wurde, aber Sie können sie immer noch aufrufen:

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

Auf diese Weise setzen Sie den OOP-Kapselungsmechanismus außer Kraft... Das ist nicht sehr schön, aber es funktioniert.

0voto

dierre Punkte 7020

Ich habe eine andere Methode gefunden, die mir eleganter zu sein scheint:

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

Dank an Colin Bartlett von ruby-forum.com

Um zu verstehen, wie das funktioniert, empfehle ich die Lektüre von David Seilers 回答

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X