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

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

Ответы [ 11 ]

158 голосов
/ 24 февраля 2012
(date2.year * 12 + date2.month) - (date1.year * 12 + date1.month)

подробнее на http://www.ruby -forum.com / topic / 72120

39 голосов
/ 19 августа 2013

Более точный ответ будет учитывать дни на расстоянии.

Например, если вы считаете, что месячное расстояние от 28/4/2000 и 1/5/2000 равно 0, а не 1, то вы можете использовать:

(date2.year - date1.year) * 12 + date2.month - date1.month - (date2.day >= date1.day ? 0 : 1)
14 голосов
/ 21 декабря 2014

Попробуйте

((date2.to_time - date1.to_time)/1.month.second).to_i
8 голосов
/ 28 сентября 2015

Вы можете перефразировать вопрос как «сколько первых дней между началами месяцев дат», а затем использовать преобразования данных в функциональном стиле:

(date1.beginning_of_month...date2.beginning_of_month).select { |date| date.day == 1 }.size
5 голосов
/ 01 мая 2018

Предполагается, что обе даты: ((date2 - date1).to_f / 365 * 12).round простой.

2 голосов
/ 05 апреля 2017
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
2 голосов
/ 22 декабря 2016
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
2 голосов
/ 11 августа 2015

Другое решение, которое я нашел (построенное на уже опубликованном здесь решении), предназначено, если вы хотите, чтобы результат включал доли месяца. Например, расстояние составляет 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...
1 голос
/ 05 июля 2018

Вот вариант грубой форсировки:

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

0 голосов
/ 24 июля 2018

Вот еще один метод. Это поможет рассчитать количество целых месяцев между двумя датами

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