program tip

Ruby on Rails에서 두 DateTime 사이의 시간 (초)을 어떻게 얻습니까?

radiobox 2020. 11. 26. 08:07
반응형

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_sDateTime 객체 를 사용 하여 출력을 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"

참고 URL : https://stackoverflow.com/questions/567636/how-do-i-get-the-number-of-seconds-between-two-datetimes-in-ruby-on-rails

반응형