developer tip

Rails 3 또는 Ruby에서 지속 시간을 시간 : 분 : 초 (또는 이와 유사한)로 변환

optionbox 2020. 8. 6. 08:16
반응형

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"

단어를 원하면 Option1을 사용 하고 H : M : S 형식을 원하면 Option2 를 사용하고 H : M : S 형식 을 원하면 24 시간을 초과 할 수있는 Option3을 사용하십시오.


루비의 문자열 %연산자는 너무 감사하고 잊혀지지 않습니다.

"%02d:%02d:%02d:%02d" % [t/86400, t/3600%24, t/60%60, t%60]

t 가 초 단위의 지속 시간이면 주어진 일을 포함하여 0으로 채워진 콜론으로 구분 된 문자열을 방출합니다. 예:

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 () 사용을 생각했지만 우분투의 EPOCH 시간이 예상대로 0 월 1 일 0 시가 아닌 Thu Jan 01 01:00:00 +0100 1970 인 것 같습니다.

Time.at(3600).strftime("%H:%M:%S")

원하는 것보다 1 시간 더줍니다.


나는 이것을 Rails 프로젝트의 지속 시간을 보여주기 위해 사용합니다.

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

하루 이상의 지속 시간에주의하십시오.

(timing/3600).to_i.to_s.rjust(2,'0') + ":"+Time.at(timing).utc.strftime("%M:%S")

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

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


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"

Of course you can extend this easily with days, months, years, etc using related ActiveSupport methods and repeating the same structure.

Keep in mind that for too long durations, this may be inaccurate since the duration of 1 month is not fixed in number of days, and I'm not sure how AS:Duration deals with that.


    hours = 3.5456
    value = (hours*60).divmod(60).map{ |a| "%02d"%[a.floor] }.join(":")
    => "03:32"

참고URL : https://stackoverflow.com/questions/4175733/convert-duration-to-hoursminutesseconds-or-similar-in-rails-3-or-ruby

반응형