답변:
참조 : 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는 S 형식 : M : 당신은 H 원하는 경우에 옵션 3은 M : 당신이 H 원하는 경우 S 형식을 24 시간 이상이있을 수 있습니다
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 ++에서 와 비슷하지만 더 간결하고 할당에 사용할 수 있습니다. 네, 사랑 스럽습니다. 그리고 강력합니다. 이 웅변을 더 잘 보여주는 예가 있지만 질문에 대답하지 않습니다. 당신의 snark는 감사하지 않습니다, btw.
다음과 같이 할 수도 있습니다.
(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 시간 더 많이줍니다.
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
endseconds.pretty_duration프로젝트 어디에서나 전화 하십시오.
275.pretty_duration # => "04:35"
9823.pretty_duration # => "02:43:43"이 답변은 Lev Lukomsky의 코드를 기반으로합니다.
사용 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
반환 값을 언제든지 필요에 맞게 조정할 수 있습니다.
하루보다 긴 시간에주의하십시오.
(timing/3600).to_i.to_s.rjust(2,'0') + ":"+Time.at(timing).utc.strftime("%M:%S")
ActiveSupport :: Duration을 활용하고 밀리 초를 처리하는 Lev Lukomsky의 답변 (코드 벤치 마크에 유용)
# 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 개월 기간이 일 수로 고정되어 있지 않기 때문에 이것은 정확하지 않을 수 있으며 AS : Duration이 어떻게 처리하는지 잘 모르겠습니다.
베스트 답변을 제공 한 @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
hours = 3.5456
value = (hours*60).divmod(60).map{ |a| "%02d"%[a.floor] }.join(":")
=> "03:32"