2010-10-18 33 views
6

que necesitan para llevar a cabo la siguiente conversión:Ruby/Rails - ¿Cómo convertir los segundos a la hora?

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

me ocurrió esto:

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

que me da el momento equivocado, porque Time.at (n) n espera que sea el número de segundos de epoch:

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

¿Cuál sería la solución independiente de huso horario más óptima para esta transformación?

Respuesta

29

El más simple de una sola línea, simplemente ignora la fecha:

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

#-> "11:00PM" 
+0

NB: Si alguien vino aquí en busca de una respuesta a conseguir una manera de convertir cualquier número de segundos (incluso los recuentos elevados que se extiende por día) en un contador HH: MM: SS siempre creciente (no solo limitado a un lapso de 24 horas), entonces esta respuesta no es la solución para eso. Ignorar la fecha, como sugiere esta respuesta, hará que el contador HH se restablezca a 00 siempre que cruce los límites del día. – Magne

2

dos ofertas:

El elaborado solución de bricolaje:

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 solución Tiempo:

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

No estoy seguro si esto es mejor que

(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

Es bueno y corto, pero creo que "toClock" hace los cálculos más directos y parece más confiable. Excepto "toClock" debería rechazar las entradas negativas, y realizar "% 86400" en la entrada. –

Cuestiones relacionadas