Programing

Ruby on Rails에서 두 날짜 사이의 개월 수 찾기

lottogame 2020. 9. 6. 11:53
반응형

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/20001/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

반응형