2010-10-18 41 views
6

tôi cần phải thực hiện các chuyển đổi sau:Ruby/Rails - Cách chuyển đổi giây thành thời gian?

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

tôi đến với điều này:

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

mà mang lại cho tôi thời điểm sai lầm, bởi vì Time.at (n) hy vọng n là số giây từ epoch:

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

Giải pháp độc lập, múi giờ tối ưu nhất cho chuyển đổi này là gì?

Trả lời

29

Đơn giản nhất-liner chỉ đơn giản là bỏ qua ngày:

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

#-> "11:00PM" 
+0

NB: Nếu ai đó đến đây tìm kiếm một câu trả lời để có được một cách để chuyển đổi bất kỳ số giây (thậm chí đếm cao mà kéo dài ngày) vào một hộ gia đình ngày càng tăng: MM: SS truy cập (không chỉ giới hạn trong một khoảng 24 giờ), sau đó câu trả lời này không phải là giải pháp cho điều đó. Bỏ qua ngày, như câu trả lời này gợi ý, sẽ làm cho bộ đếm HH được đặt lại thành 00 bất cứ khi nào đi qua các ranh giới ngày. – Magne

2

Hai Mời:

Các công phu DIY giải pháp:

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 

giải pháp Thời gian:

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

Không chắc nếu điều này là tốt hơn so với

(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

Nó đẹp và ngắn, nhưng tôi nghĩ "toClock" có tính toán trực tiếp hơn và trông đáng tin cậy hơn. Ngoại trừ "toClock" nên từ chối đầu vào âm và thực hiện "% 86400" trên đầu vào. –

Các vấn đề liên quan