[ruby-on-rails] Rails 3 또는 Ruby에서 기간을 시간 : 분 : 초 (또는 유사)로 변환

이 작업을 수행하는 간단한 / 내장 된 방법이 있다는 느낌이 있지만 찾을 수 없습니다.

정수로 된 기간 (초)이 있고 친숙한 형식으로 표시하고 싶습니다.

예를 들어 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 프로젝트의 기간을 표시합니다.

  1. Integer클래스에 사용자 지정 메서드를 추가합니다 . 당신은라는 새로운 파일을 생성 할 수 있습니다 pretty_duration.rbinitializers폴더를 :

    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
  2. 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

반환 값을 언제든지 필요에 맞게 조정할 수 있습니다.