2010-10-18 11 views
6

muszę wykonać następujące przekształcenia:Ruby/Rails - jak przekonwertować sekundy na czas?

0  -> 12.00AM 
1800 -> 12.30AM 
3600 -> 01.00AM 
... 
82800 -> 11.00PM 
84600 -> 11.30PM 

wymyśliłem to:

(0..84600).step(1800){|n| puts "#{n.to_s} #{Time.at(n).strftime("%I:%M%p")}"} 

co daje mi zły czas, bo Time.at (n) n spodziewa się liczba sekundy od epoki:

0  -> 07:00PM 
1800 -> 07:30PM 
3600 -> 08:00PM 
... 
82800 -> 06:00PM 
84600 -> 06:30PM 

Jakie byłoby najbardziej optymalne, niezależne od strefy czasowej rozwiązanie tej transformacji?

Odpowiedz

29

Najprostszy jeden-liner prostu ignoruje datę:

Time.at(82800).utc.strftime("%I:%M%p") 

#-> "11:00PM" 
+0

UWAGA: Jeśli ktoś przyszedł tu w poszukiwaniu odpowiedzi, aby uzyskać sposób przekonwertować dowolną liczbę sekund (nawet wysokie liczby, która jest rozpięta dni) na coraz większy licznik HH: MM: SS (nie tylko ograniczony do 24-godzinnej rozpiętości), wtedy ta odpowiedź nie jest rozwiązaniem tego. Zignorowanie daty, jak sugeruje ta odpowiedź, spowoduje, że licznik HH zostanie zresetowany do 00 za każdym razem przekraczając granice dnia. – Magne

2

dwie oferty:

Do opracowania rozwiązanie DIY:

def toClock(secs) 
    h = secs/3600; # hours 
    m = secs % 3600/60; # minutes 
    if h < 12 # before noon 
    ampm = "AM" 
    if h = 0 
     h = 12 
    end 
    else  # (after) noon 
    ampm = "PM" 
    if h > 12 
     h -= 12 
    end 
    end 
    ampm = h <= 12 ? "AM" : "PM"; 
    return "#{h}:#{m}#{ampm}" 
end 

rozwiązanie Czas:

def toClock(secs) 
    t = Time.gm(2000,1,1) + secs # date doesn't matter but has to be valid 
    return "#{t.strftime("%I:%M%p")} # copy of your desired format 
end 

HTH

3

Nie wiem, czy to jest lepsze niż

(Time.local(1,1,1) + 82800).strftime("%I:%M%p") 


def hour_minutes(seconds) 
    Time.at(seconds).utc.strftime("%I:%M%p") 
end 


irb(main):022:0> [0, 1800, 3600, 82800, 84600].each { |s| puts "#{s} -> #{hour_minutes(s)}"} 
0 -> 12:00AM 
1800 -> 12:30AM 
3600 -> 01:00AM 
82800 -> 11:00PM 
84600 -> 11:30PM 

Stephan

+0

To jest ładne i krótkie, ale myślę, że "toClock" robi bardziej bezpośrednie obliczenia i wygląda bardziej niezawodnie. Z wyjątkiem "toClock" powinien odrzucić ujemne wejścia i wykonać "% 86400" na wejściu. –

Powiązane problemy