Ruby on Rails에서 두 날짜 사이의 개월 수 찾기
두 개의 Ruby on Rails DateTime 개체가 있습니다. 그들 사이의 개월 수를 찾는 방법은 무엇입니까? (다른 해에 속할 수 있음을 명심하십시오)
(date2.year * 12 + date2.month) - (date1.year * 12 + date1.month)
http://www.ruby-forum.com/topic/72120 에서 자세한 정보
더 정확한 대답은 멀리있는 날을 고려할 것입니다.
당신의 달 거리 것을 고려하는 경우 예를 들어, 28/4/2000
및 1/5/2000
입니다 0
보다는 1
, 당신은 사용할 수 있습니다 :
(date2.year - date1.year) * 12 + date2.month - date1.month - (date2.day >= date1.day ? 0 : 1)
시도해보십시오
((date2.to_time - date1.to_time)/1.month.second).to_i
질문을 "날짜의 시작일 사이에 첫 번째 날이 몇 일인지"로 바꾸고 기능적 스타일 데이터 변환을 사용할 수 있습니다.
(date1.beginning_of_month...date2.beginning_of_month).select { |date| date.day == 1 }.size
둘 다 날짜라고 가정하면 ((date2 - date1).to_f / 365 * 12).round
간단합니다.
내가 찾은 또 다른 솔루션 (이미 여기에 게시 된 솔루션으로 구축 됨)은 결과에 한 달의 분수를 포함하려는 경우입니다. 예를 들어 거리는입니다 1.2 months
.
((date2.to_time - date1.to_time)/1.month.second).round(1) #Tenth of a month Ex: 1.2
((date2.to_time - date1.to_time)/1.month.second).round(2) #Hundreth, ex: 1.23 months
etc...
start_date = Date.today
end_date = Date.today+90
months = (end_date.month+end_date.year*12) - (start_date.month+start_date.year*12)
//months = 3
def difference_in_months(date1, date2)
month_count = (date2.year == date1.year) ? (date2.month - date1.month) : (12 - date1.month + date2.month)
month_count = (date2.year == date1.year) ? (month_count + 1) : (((date2.year - date1.year - 1 ) * 12) + (month_count + 1))
month_count
end
다음은 무차별 대입 변형입니다.
date1 = '2016-01-05'.to_date
date2 = '2017-02-27'.to_date
months = 0
months += 1 while (date2 << (count+1)) >= date1
puts months # => 13
date2
항상보다 커야합니다. date1
두 날짜 사이에 정확한 개월 수 (소수점 포함)가 필요했고 다음과 같은 방법을 작성했습니다.
def months_difference(period_start, period_end)
period_end = period_end + 1.day
months = (period_end.year - period_start.year) * 12 + period_end.month - period_start.month - (period_end.day >= period_start.day ? 0 : 1)
remains = period_end - (period_start + months.month)
(months + remains/period_end.end_of_month.day).to_f.round(2)
end
9 월 26 일과 9 월 26 일 (당일)을 비교하면 1 일로 계산합니다. 필요하지 않은 경우 메서드의 첫 번째 줄을 제거 할 수 있습니다.period_end = period_end + 1.day
다음 사양을 통과합니다.
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 8, 31))).to eq 1.0
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 8, 30))).to eq 0.97
expect(months_difference(Date.new(2017, 8, 1), Date.new(2017, 10, 31))).to eq 3.0
# Overlapping february (28 days) still counts Feb as a full month
expect(months_difference(Date.new(2017, 1, 1), Date.new(2017, 3, 31))).to eq 3.0
expect(months_difference(Date.new(2017, 2, 10), Date.new(2017, 3, 9))).to eq 1.0
# Leap year
expect(months_difference(Date.new(2016, 2, 1), Date.new(2016, 2, 29))).to eq 1.0
다른 방법이 있습니다. 이것은 두 날짜 사이의 전체 개월 수를 계산하는 데 도움이됩니다.
def months_difference(date_time_start, date_time_end)
curr_months = 0
while (date_time_start + curr_months.months) < date_time_end
curr_months += 1
end
curr_months -= 1 if (date_time_start + curr_months.months) > date_time_end
curr_months.negative? ? 0 : curr_months
end
참고 URL : https://stackoverflow.com/questions/9428605/find-number-of-months-between-two-dates-in-ruby-on-rails
'Programing' 카테고리의 다른 글
여러 화면을 지원하는 애플리케이션 스켈레톤 (0) | 2020.09.07 |
---|---|
Ruby에서 SOAP를 사용하는 가장 좋은 방법은 무엇입니까? (0) | 2020.09.06 |
Java에서 이름으로 클래스를 인스턴스화하는 방법이 있습니까? (0) | 2020.09.06 |
JS 개체를 양식 데이터로 변환 (0) | 2020.09.06 |
Python을 사용하여 CSV 파일을 sqlite3 데이터베이스 테이블로 가져 오기 (0) | 2020.09.06 |