2010-10-18 12 views
6

Ho bisogno di eseguire la seguente conversione:Ruby/Rails - Come convertire secondi in tempo?

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

sono arrivato fino a questo:

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

che mi dà nel momento sbagliato, perché Time.at (n) si aspetta di essere n numero di secondi da epoca:

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

Quale sarebbe la soluzione più ottimale, indipendente dal fuso orario per questa trasformazione?

risposta

29

Il più semplice one-liner ignora semplicemente la data:

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

#-> "11:00PM" 
+0

NB: Se qualcuno è venuto qui in cerca di una risposta per ottenere un modo per convertire un qualsiasi numero di secondi (anche alti conteggi che si estende giorni) in un contatore sempre crescente di HH: MM: SS (non limitato a un intervallo di 24 ore), quindi questa risposta non è la soluzione a questo. Ignorando la data, come suggerito da questa risposta, il contatore HH verrà reimpostato su 00 ogni volta che attraverserà i limiti del giorno. – Magne

2

Due offerte:

La soluzione elaborata fai da te:

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 

la soluzione Tempo:

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

Non sono sicuro se questo è meglio di

(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

È bello e breve, ma penso che "toClock" faccia i calcoli più diretti e sia più affidabile. Tranne "toClock" dovrebbe rifiutare gli input negativi ed eseguire "% 86400" sull'input. –

Problemi correlati