이 작업을 수행하는 간단한 / 내장 된 방법이 있다는 느낌이 있지만 찾을 수 없습니다.
정수로 된 기간 (초)이 있고 친숙한 형식으로 표시하고 싶습니다.
예를 들어 3600은 “01:00:00″또는 “1 시간”등으로 표시됩니다.
나는 그것을 할 수 time_ago_in_words(Time.zone.now+3600)
있지만 약간의 해킹처럼 느껴집니다.이 값을 포맷하기 위해 현재 시간에서 더하거나 빼야 할 이유가 없습니다. 거기인가 duration_in_words()
또는 무엇인가?
감사
답변
참조 : http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html
distance_of_time_in_words(3600)
=> "about 1 hour"
답변
합산:
그것을 가정 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는 S 형식 : M : 당신은 H 원하는 경우에 옵션 3은 M : 당신이 H 원하는 경우 S 형식을 24 시간 이상이있을 수 있습니다
답변
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"
아름다운.
답변
다음과 같이 할 수도 있습니다.
(Time.mktime(0)+3600).strftime("%H:%M:%S")
원하는대로 포맷합니다.
BTW, 원래 Time.at () 사용을 생각했지만 Ubuntu의 EPOCH 시간은 Thu Jan 01 01:00:00 +0100 1970이고 예상대로 00:00:00 시간이 아닌 것으로 보입니다.
Time.at(3600).strftime("%H:%M:%S")
원하는 것보다 1 시간 더 많이줍니다.
답변
이것을 사용하여 Rails 프로젝트의 기간을 표시합니다.
-
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의 코드를 기반으로합니다.
답변
이것은 모호한 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
반환 값을 언제든지 필요에 맞게 조정할 수 있습니다.