Rubin, erhalten Stunden, Sekunden und Zeit von Date.day_fraction_to_time
-
03-10-2019 - |
Frage
Ich habe diese Methode finden Sie hier: .
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 folgende Fehlermeldung:
`<main>': private method `day_fraction_to_time' called for Date:Class (NoMethodError)
Ich habe überprüft /usr/lib/ruby/1.9.1/date.rb und ich habe es 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. /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 ich die Dokumentation zu sehen, ging (1,9) und es gibt keine Spur von dieser Methode. Ich weiß, es ist eine dumme Frage, aber warum haben sie es entfernen? Es gibt auch dieses Beispiel, wie in der Methode zu verwenden, /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 bin immer noch den Fehler bekommen:
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>'
Lösung
Ich weiß nicht, warum es privat gemacht wurde, aber man kann es immer noch zugreifen:
hours,minutes,seconds,frac = Date.send(:day_fraction_to_time, stop-start)
Auf diese Weise kann die OOP Verkapselung mechanizm außer Kraft setzen ... Das ist nicht eine sehr schöne Sache zu tun, aber es funktioniert.
Andere Tipps
Ich habe eine andere Methode gefunden, die mir elegantere 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 Colin Bartlett von ruby-forum.com
Um zu verstehen, wie es funktioniert Ich schlage vor, David Seiler Antwort