Ruby / Rails - Как конвертировать секунды в время? - PullRequest
10 голосов
/ 19 октября 2010

Мне нужно выполнить следующее преобразование:

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

Я придумал это:

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

что дает мне неправильное время, потому что Time.at (n) ожидает, что n будет числом секунд от эпохи:

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

Что было бы наиболее оптимальным, независимым от часового пояса решением для этого преобразования?

Ответы [ 3 ]

34 голосов
/ 19 октября 2010

Самый простой однострочник просто игнорирует дату:

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

#-> "11:00PM"
3 голосов
/ 19 октября 2010

Не уверен, что это лучше, чем

(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

2 голосов
/ 19 октября 2010

Два предложения:

Продуманное решение 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

Время решения:

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

...