2010-06-16 3 views
34

누군가가 저에게이 질문에 대한 답을 알려주고 있지만이 간단한 문제에 대한 행운을 찾지 못한듯한 느낌이 들었습니다.일 차이 계산 ActiveSupport : TimeWithZone이 가장 "루비"스타일입니까?

나는 datetime 속성을 가진 Activerecord가 있습니다. ActiveSupport : TimeWithZone으로 반환됩니다. TimeTime.zone을 사용할 필요가있는 영역을 포함하지 않기 때문에 DateTime.now와 비교할 수 없다는 것을 안다. 말이된다.

제가 스타일에 따라 궁금한 점은 86400으로 결과를 빼고 나누는 것보다 이렇게하는 "더 깨끗한"방법일까요?

는 여기에 내가 할 수있는 작업은 다음과 같습니다

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i 

작품을하지만 해제 rubyish 보인다 내가 뭔가 빠진 것 같은 느낌. 나는 다른 경로를 비교하거나 변환하거나 주조해야 하는가? 아니면 레일에서 이것을 수행하는 전형적인 방법 일까? 팁이나 이미이 문제를 다루는 질문에 대한 링크를 이해하십시오.

감사합니다

당신이 더 읽기 쉽게하기 위해 할 수있는
+0

대하면 출력 말씀을 하시겠습니까 체크 아웃? – theIV

+0

나는 momemnt의 모델에서 이렇게하기로 제한되어 있으므로 time_ago_in_words 도우미를 이용할 수 없습니다. 나는 int 값을 클라이언트 응용 프로그램으로 되돌려 놓고 있습니다. 모두에게 의견을 보내 주셔서 감사합니다. – Nick

답변

73

한 가지입니다

((Time.zone.now - myActiveRecord.visit_date)/1.day).to_i 

편집 :

사실 당신이 브래킷 한 세트를 제거 할 수 있습니다

(Time.zone.now - myActiveRecord.visit_date).to_i/1.day 
+0

실제로 아래에서 언급 할 수있는 방법이 있습니다. – jamesconant

+0

''(Time.zone.now - 3.days.ago) .to_i/1.day''는''2''를 출력합니다 – dgilperez

+1

이것이 항상 작동하지는 않습니다. 나는 대신에 다음을해야만했다 :'(myActiveRecord.end_date.to_datetime.to_i - Time.now.to_i)/1.day' –

14

나는이 질문이 약간 날짜가다는 것을 알고있다 그러나 유사한 것을 위해 Google 검색하는 동안 그것을 발견했다 문제. 필자의 경우 매크로와 마이크로 스케일의 차이를 하루 종일 알 필요가있었습니다.

예를 들어, 2010 년 12 월 31 일이 2012 년 1 월 1 일 366 일 전이며 2010 년 12 월 31 일 23:59가 2011 년 1 월 1 일에서 1 일 남았음을 알 수 있도록 코드가 필요합니다. 00 : 00. 위의 방법은 전자에서 작동하지만 후자의 경우 0 일 간격으로 진행됩니다.

나는 결국 Ruby의 Date 클래스를 사용하여 수학을 수행했다. 내 방법은 위의 코드를 사용하면 다음과 같습니다 :이 때문에 변환에 Time 또는 DateTime에 입력으로 작동합니다

(Time.zone.now.to_date - myActiveRecord.visit_date.to_date).to_i

. 또 다른 가능한 해결책은 Times 또는 DateTimes 각각에 우선 beginning_of_day으로 전화하는 것이지만, 제 경우에는 중요합니다.

-1

실제로 레일즈는 이런 종류의 작업을 위해 내장 된 메소드를 가지고 있습니다.

모두가 말하고 완료되면 #time_ago_in_words

그래서 원래 케이스 ...

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

time_ago_in_words(myActiveRecord.visit_date)

+0

실제로이 메서드는 실제 숫자 차이가 아니라 사람이 읽을 수있는 문자열 설명을 반환합니다. –

+0

죄송합니다. – jamesconant