Ruby on Rails에서 두 DateTime 사이의 시간 (초)을 어떻게 얻습니까?
직원을 위해 시간을 추적하는 코드가 있습니다. 직원이 근무한 시간을 보여주는 카운터를 생성합니다.
이것은 현재 코드입니다.
start_time = Time.parse(self.settings.first_clock_in)
total_seconds = Time.now - start_time
hours = (total_seconds/ 3600).to_i
minutes = ((total_seconds % 3600) / 60).to_i
seconds = ((total_seconds % 3600) % 60).to_i
이것은 잘 작동합니다. 그러나 시간이 1970-2038 범위로 제한되어 있기 때문에 모든 시간 사용을 DateTimes로 바꾸려고합니다. 두 DateTime 사이의 초 수를 얻는 방법을 알아낼 수 없습니다. 그것들을 빼면 내가 해석하는 방법을 모르는 Rational이 나오고, Times를 빼면 초 단위의 차이가 나옵니다.
참고 : Ruby 1.9.2부터는 하드 제한 시간이 제거되었습니다. 그러나 시간은 1823-11-12에서 2116-02-20 사이의 값에 최적화되어 있습니다.
두 개의 DateTimes를 빼면 경과 시간 (일)이 반환되므로 다음과 같이 할 수 있습니다.
elapsed_seconds = ((end_time - start_time) * 24 * 60 * 60).to_i
또는 더 읽기 쉽게 :
diff = datetime_1 - datetime_2
diff * 1.days # => difference in seconds; requires Ruby on Rails
귀하 또는 다른 검색자가 실제로 찾고있는 것은 다음과 같습니다.
diff = datetime_1 - datetime_2
Date.day_fraction_to_time(diff) # => [h, m, s, frac_s]
를 사용하여 부동 소수점으로 변환 할 수 to_f
있지만 부동 소수점과 관련된 일반적인 정밀도 손실이 발생합니다. 전체 초 동안 정수로 캐스팅하는 경우 걱정할만큼 크면 안됩니다.
결과는 초 단위입니다.
>> end_time.to_f - start_time.to_f
=> 7.39954495429993
>> (end_time.to_f - start_time.to_f).to_i
=> 7
그렇지 않으면 to_formatted_s
DateTime 객체 를 사용 하여 출력을 Decimal
클래스가 허용 하는 것으로 동축 할 수 있는지 확인 하거나 문자열로 일반 Unix 시간으로 형식을 지정하고 호출 to_i
할 수 있습니다.
다른 사람들은 분수 나 도우미 함수에 잘못 의존합니다. 그것보다 훨씬 간단합니다. DateTime 자체는 그 아래 정수입니다. Ruby 방식은 다음과 같습니다.
stop.to_i - start.to_i
예:
start = Time.now
=> 2016-06-21 14:55:36 -0700
stop = start + 5.seconds
=> 2016-06-21 14:55:41 -0700
stop.to_i - start.to_i
=> 5
나는 ruby-2.1.4를 사용하고 있으며 다음과 같이 작동했습니다.
Time.now - Time.new(2014,11,05,17,30,0)
나에게 초 단위의 시차를 주었다
참조 : 루비 문서
이를위한 방법이 있습니다.
Time.now.minus_with_coercion(10.seconds.ago)
10과 같습니다.
출처 : http://apidock.com/rails/Time/minus_with_coercion
내가 도왔기를 바랍니다.
다음과 같이 Ruby 함수를 정의합니다.
def time_diff(start_time, end_time)
seconds_diff = (start_time - end_time).to_i.abs
days = seconds_diff / 86400
seconds_diff -= days * 86400
hours = seconds_diff / 3600
seconds_diff -= hours * 3600
minutes = seconds_diff / 60
seconds_diff -= minutes * 60
seconds = seconds_diff
"#{days} Days #{hours} Hrs #{minutes} Min #{seconds} Sec"
end
이 함수를 호출하면
time_diff(Time.now, Time.now-4.days-2.hours-1.minutes-53.seconds)
내장 "sec"를 사용하지 않는 이유는 무엇입니까? 다음은 예입니다.
t1 = Time.now.sec
elapsed_t = Time.now.sec - t1
puts "it took me : #{elapsed_t} seconds to do something that is useful \n"
'program tip' 카테고리의 다른 글
Mac OS X에서 Docker (1.9.1)로 다운로드 한 Docker 이미지의 위치 (0) | 2020.11.26 |
---|---|
스크럼 마스터는 하루 종일 무엇을합니까? (0) | 2020.11.26 |
임의의 날짜로 행을 업데이트하는 방법 (0) | 2020.11.26 |
jQuery, 다중으로 배열을 얻는 방법 (0) | 2020.11.26 |
난수 생성을위한 가장 안전한 시드는 무엇입니까? (0) | 2020.11.26 |