2010-10-18 8 views
6

J'ai besoin pour effectuer la conversion suivante:Ruby/Rails - Comment convertir les secondes en temps?

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

je suis venu avec ceci:

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

qui me donne le mauvais moment, parce que Time.at (n) prévoit que n soit nombre de secondes de l'époque:

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

Quelle serait la solution la plus optimale, indépendante de fuseau horaire pour cette transformation?

Répondre

29

Le plus simple en une ligne ne tient pas simplement la date:

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

#-> "11:00PM" 
+0

NB: Si quelqu'un est venu ici pour trouver une réponse pour obtenir un moyen de convertir un certain nombre de secondes (même un nombre élevé qui enjambe jours) dans un compteur HH: MM: SS toujours croissant (pas seulement limité à une durée de 24 heures), alors cette réponse n'est pas la solution à cela. Ignorer la date, comme le suggère cette réponse, rendra le compteur HH réinitialisé à 00 chaque fois qu'il franchira les limites du jour. – Magne

2

Deux offres:

La complexe solution 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 

la solution Time:

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

Je ne sais pas si cela vaut mieux 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

C'est agréable et court, mais je pense que "toClock" fait les calculs les plus directs et semble plus fiable. Sauf que "toClock" doit rejeter les entrées négatives et exécuter "% 86400" sur l'entrée. –

Questions connexes