回答:
参照:http : //api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html
distance_of_time_in_words(3600)
=> "about 1 hour"
distance_of_time_in_words
渡すことで丸められた数値を取得できvague: true
ます。
まとめ:
仮定して total_seconds = 3600
オプション1:
distance_of_time_in_words(total_seconds) #=> "about 1 hour"
オプション2:
Time.at(total_seconds).utc.strftime("%H:%M:%S") #=> "01:00:00"
オプション3:
seconds = total_seconds % 60
minutes = (total_seconds / 60) % 60
hours = total_seconds / (60 * 60)
format("%02d:%02d:%02d", hours, minutes, seconds) #=> "01:00:00"
使用オプション1を使用すると、単語をしたい場合は、オプション2を M:S形式、あなたはHしたい場合はオプション3を M:Sフォーマットと24時間以上があることができますが、Hをしたい場合
01:00:00
。
Rubyの文字列%
演算子はあまり評価されておらず、忘れられがちです。
"%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60]
与えられたtは秒単位の期間で、これは日を含め、ゼロパディングコロンで区切られた文字列を発します。例:
t = 123456
"%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60]
=> "01:10:17:36"
美しい。
%
「私の右からパラメータの配列を取ると私の左のフォーマット文字列に挿入してください。」と言います その点ではprintf
、C \ C ++ と似ていますが、より簡潔であり、割り当てで使用できます。はい、私はそれを素敵と呼びます。そしてパワフル。この雄弁さをよりよく示す例がありますが、彼らは質問に答えません。ところで、あなたのヘビは高く評価されていません。
あなたは次のようなこともできると思います:
(Time.mktime(0)+3600).strftime("%H:%M:%S")
必要に応じてフォーマットします。
ちなみに、もともとはTime.at()を使うことを考えていましたが、UbuntuのEPOCH時間は木曜日1月1日01:00:00 +0100 1970であり、期待した00:00:00時間ではないようです。
Time.at(3600).strftime("%H:%M:%S")
必要以上に1時間多くなります。
Integer
クラスにカスタムメソッドを追加します。あなたはと呼ばれる新しいファイルを作成することができますpretty_duration.rb
でinitializers
フォルダを:
class Integer
def pretty_duration
parse_string =
if self < 3600
'%M:%S'
else
'%H:%M:%S'
end
Time.at(self).utc.strftime(parse_string)
end
end
seconds.pretty_duration
プロジェクトのどこかに電話します。
275.pretty_duration # => "04:35"
9823.pretty_duration # => "02:43:43"
この答えは、Lev Lukomskyのコードに基づいています
これは、obscure divmod
メソッドを使用して除算とモジュロを同時に行うため、Float
秒を適切に処理します。
def duration(seconds)
minutes, seconds = seconds.divmod(60)
hours, minutes = minutes.divmod(60)
days, hours = hours.divmod(24)
"#{days.to_s.rjust(3)}d #{hours.to_s.rjust(2)}h #{minutes.to_s.rjust(2)}m #{seconds}s"
end
の使用はTime.utc.strftime
、総時間数が24未満の場合にのみ機能します。
2.2.2 :004 > Time.at(60 * 60).utc.strftime('%H h %M m')
=> "01 h 00 m"
値が大きい場合、不正な結果が返されます。
2.2.2 :006 > Time.at(60 * 60 * 24).utc.strftime('%H h %M m')
=> "00 h 00 m"
この問題に対して私が見つけた最も簡単な方法を使用することをお勧めします。
def formatted_duration total_seconds
hours = total_seconds / (60 * 60)
minutes = (total_seconds / 60) % 60
seconds = total_seconds % 60
"#{ hours } h #{ minutes } m #{ seconds } s"
end
いつでも必要に応じて戻り値を調整できます。
1日より長い期間に注意してください。
(timing/3600).to_i.to_s.rjust(2,'0') + ":"+Time.at(timing).utc.strftime("%M:%S")
Lev LukomskyのActiveSupport :: Durationを利用し、ミリ秒を処理する(ベンチマークコードに役立つ)から発想を得た回答
# duration in ms modulus number of ms in one second
milliseconds = duration.in_milliseconds % 1.second.in_milliseconds
# duration in seconds modulus number of seconds in one minute
seconds = (duration / 1.second) % (1.minute / 1.second)
# duration in minutes modulus number of minutes in one hour
minutes = (duration / 1.minute) % (1.hour / 1.minute)
# duration in hours modulus number of hours in one day
hours = (duration / 1.hour) % (1.day / 1.hour)
format("%02d:%02d:%02d:%03d", hours, minutes, seconds, milliseconds) #=> "12:05:00:001"
もちろん、関連するActiveSupportメソッドを使用して同じ構造を繰り返し、日、月、年などでこれを簡単に拡張できます。
期間が長すぎる場合、1か月の期間は日数で固定されないため、これは不正確になる可能性があることに注意してください。
最高の答えを(コメントの形式で)提供した@joshuapinterに叫びます。
ドロップイン置換dotiw
宝石を使用して、さまざまなニーズに合わせて出力の精度をより詳細に制御します。
https://github.com/radar/distance_of_time_in_words
サンプルビューコード:
%label
Logoff after:
- expire_in = distance_of_time_in_words(Time.now, Time.now + user.custom_timeout.minutes, :only => [:minutes, :hours, :days])
= expire_in
次のような結果になります:
Logoff after: 1 day, 13 hours, and 20 minutes