2010-03-04 8 views
7

Zastanawiam się, czy istnieje wbudowana metoda w Rubim, która pozwala mi konwertować czasy okrążeń w formacie hh: mm: ss. sss do milisekund i na odwrót. Ponieważ muszę wykonać z nim kilka obliczeń, założyłem, że najłatwiej będzie to zrobić z konwersją na milisekundy. Powiedz mi, czy się mylę :)Konwertuj czasy trwania w Ruby - hh: mm: ss.sss do milisekund i na odwrót

+0

Która obliczenia trzeba zrobić? Klasa Ruby 'DateTime' jest bardzo przydatna w przypadku większości typów obliczeń. –

+0

Dodawanie i odejmowanie w ogóle. Oprócz tego czasy te są związane z pewną intensywnością, na przykład: "02: 25.700 przy 70% intensywności". Na podstawie tego czasu musiałbym obliczyć teoretyczny czas na 100% intensywności. Ze względu na kompletność: czasy te nie są związane z określoną datą. – herrherr

Odpowiedz

8

Co powiesz na to?

a=[1, 1000, 60000, 3600000]*2 
ms="01:45:36.180".split(/[:\.]/).map{|time| time.to_i*a.pop}.inject(&:+) 
# => 6336180 
t = "%02d" % (ms/a[3]).to_s << ":" << 
    "%02d" % (ms % a[3]/a[2]).to_s << ":" << 
    "%02d" % (ms % a[2]/a[1]).to_s << "." << 
    "%03d" % (ms % a[1]).to_s 
# => "01:45:36.180" 
+0

Trochę czasu zajęło mi zrozumienie go w pełni, ale działa jak urok :) Dzięki za to. – herrherr

+1

Przepraszam, powinienem umieścić tam kilka komentarzy zamiast grać w golfa. –

+0

Dzięki temu działa dobrze! – jspooner

3

Ponieważ całkowicie ignorujesz datę i prawdopodobnie masz liczbę większą niż 24 jako liczbę godzin, być może istniejące klasy Ruby nie są dla Ciebie odpowiednie (przynajmniej te ze standardu lib).

W rzeczywistości istnieje kilka metod, które mogą być pomocne: time_to_day_fraction i day_fraction_to_time, ale z jakiegoś powodu są prywatne (przynajmniej w wersji 1.9.1).

więc można albo małpa-załatać je do ich publikowania, lub po prostu skopiować i wkleić ich realizację do kodu:

def time_to_day_fraction(h, min, s) 
    Rational(h * 3600 + min * 60 + s, 86400) # 4p 
end 

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

Pracują z Rational klasy, więc można obliczyć łatwo z nimi.

+0

Jeśli dodaję milisekundy, powinno to zadziałać. Wypróbuję to później. Dzięki :) – herrherr

+0

Działa już z milisekundami, po prostu przekazujesz sekundy jako Float lub Rational ('time_to_day_fraction (1,45,22.345)'). –

+0

Nie działa z floatem, otrzymuję "nieokreśloną metodę" gcd ". – herrherr

Powiązane problemy