19

次の変換を実行する必要があります。

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

この変換に最適な、タイムゾーンに依存しないソリューションは何でしょうか。

4

4 に答える 4

39

最も単純なワンライナーは、単に日付を無視します。

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

#-> "11:00PM"
于 2010-10-19T00:33:21.060 に答える
3

これがより良いかどうかわからない

(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

ステファン

于 2010-10-19T07:59:27.853 に答える
2

2つのオファー:

手の込んだ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

于 2010-10-19T00:35:43.340 に答える
1

他のソリューションでは、24時間制の境界を越えると、アワーカウンターが00にリセットされます。また、切り捨てられることに注意してください。入力に小数秒がある場合、間違った結果が得られます(たとえば、正しい場合は00:08: Time.at00`ではなく、いつt=479.9Time.at(t).utc.strftime("%H:%M:%S")なるかなど)。00:07:59

任意の秒数(24時間の日スパンを超える高いカウントでも)を増え続けるHH:MM:SSカウンターに変換し、潜在的な小数秒を処理する方法が必要な場合は、次のようにしてください。

# Will take as input a time in seconds (which is typically a result after subtracting two Time objects),
# and return the result in HH:MM:SS, even if it exceeds a 24 hour period.
def formatted_duration(total_seconds)
  total_seconds = total_seconds.round # to avoid fractional seconds potentially compounding and messing up seconds, minutes and hours
  hours = total_seconds / (60*60)
  minutes = (total_seconds / 60) % 60 # the modulo operator (%) gives the remainder when leftside is divided by rightside. Ex: 121 % 60 = 1
  seconds = total_seconds % 60
  [hours, minutes, seconds].map do |t|
    # Right justify and pad with 0 until length is 2. 
    # So if the duration of any of the time components is 0, then it will display as 00
    t.round.to_s.rjust(2,'0')
  end.join(':')
end

https://gist.github.com/shunchu/3175001でのディスカッションの@springerigorと提案から変更

于 2020-12-06T08:46:48.700 に答える