Найти количество месяцев между двумя датами в Ruby on Rails - PullRequest
88 голосов
/ 24 февраля 2012

У меня есть два объекта DateTime в Ruby on Rails. Как узнать количество месяцев между ними? (Помня, что они могут принадлежать разным годам)

Ответы [ 11 ]

0 голосов
/ 26 сентября 2017

Мне нужно было точное количество месяцев (включая десятичные) между двумя датами, и я написал для него следующий метод:

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

Если сравнить, скажем, с 26 сентября по 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...