2012-11-10 7 views
1

두 개의 날짜가 있습니다 : start dateend date입니다. end datestart date 사이의 일 수를 계산하고 싶습니다. start date1-11-2011이면 end date2-11-2012이고, start date - end date을 입력하면 일 수는 1으로 표시되며 월과 연도는 계산하지 않습니다. 루비에서 어떻게 할 수 있습니까? 친절하게 도와주세요.날짜 사이의 일 수

+0

당신은'라는 이름의 변수가 date' 나'종료 날짜를 시작할 수 없습니다

time_ago_in_words(pending_requests.created_at) 

이 일 및 시간, 예를 들어 같은 두 을 처리됩니다 '. 실제로'start_date'와 같은 것을 가지고 있습니까? – sawa

답변

4
require 'date' 

start_date = Date.parse('1-11-2011') 
# => #<Date: 2011-11-01 … > 
end_date = Date.parse('2-11-2012') 
# => #<Date: 2012-11-02 … > 

inclusive_days_in_range = (start_date .. end_date).count 
# => 368 

또는 효율성에 대해 (2 차의 크기에 더 빨리) 신경 경우 :

inclusive_days_in_range = (end_date - start_date) + 1 
# => 368 

당신이 Date.parse를 사용하는 경우, 당신처럼 주어진 날짜 문자열이있는 것처럼 해석됩니다 있습니다 하루가 시작되어 월과 일이 뒤 따른다. 그것이 원하는 것이 아니라면, 지구상에 어떤 국가도 알지 못하더라도이 날짜 형식을 수동으로 지정하려면 Date.strptime 메서드를 사용해야합니다. 분명히 당신은 또한 날짜는 다음과 같은 방법으로 개체를 초기화 할 수있는 구문 분석 문자열을 방지하려면 :

Date.new(2012, 1, 11) 

또 다른 좋은 아이디어는 응용 프로그램 내부에 ISO-8601 (YYYY-MM-DD) 형식을 사용 만 국소로 변환하는 것 명확성을 향상시키기위한 요구에 대한 표현.

+2

'(start_date ... end_date) .count'을하지 않으면 많은 Date 객체를 초기화 할 것입니다. 대신에'end_date - start_date'를하십시오. – levinalex

+1

예, 효율성이 적절하다면 그렇게해야합니다. 그러나 그 범위의 하루는 계산되지 않는다는 사실을 알고 있어야합니다. 'result + 1'을 추가해야합니다. – aef

5
require "date" 
(
    Date.strptime("2-11-2012", "%m-%d-%Y") - 
    Date.strptime("1-11-2011", "%m-%d-%Y") 
).to_i + 1 
# => 397 
+1

필자가 내 대답에 대해 언급 한대로, 날짜를 빼면 포용력이있는 범위를 가지고있는 것처럼 하루 종일 계산하지 않습니다. – aef

+0

@aef 오른쪽. 나는이 대답을 위해 그 부분을 놓쳤다. 나는 그것을 바로 잡았다. 감사. – sawa

0

시도해보십시오.

about 17 hours ago 

3 days ago 
관련 문제