получить десятичное количество месяцев для диапазона дат - PullRequest
2 голосов
/ 27 августа 2011

Я пытаюсь получить десятичное количество месяцев для диапазона дат.Пример:

ruby-1.9.2-p0 > from = Date.new(2011, 7, 6)
 => Wed, 06 Jul 2011 
ruby-1.9.2-p0 > to = Date.new(2011, 8, 31)
 => Wed, 31 Aug 2011 
ruby-1.9.2-p0 > to - from
 => (56/1) 

Таким образом, разница составляет 56 дней.Но я хочу и нуждаюсь в количестве месяцев: 1.83

Я создал следующий фрагмент кода, который возвращает правильный результат, но не похож на ruby:

months = Hash.new
(from..to).each do |date|
  unless months.key? date.beginning_of_month
    months[date.beginning_of_month] = 1
  else
    months[date.beginning_of_month] += 1
  end
end

multiplicator = 0.0
months.each do |month, days|
  multiplicator += days.to_f/month.end_of_month.day
end

return multiplicator.floor_to(2)

Toбыть честным: это выглядит некрасиво и действительно неэффективно.Но я просто не могу найти более простой способ.Можете ли вы помочь мне найти лучшее решение?

По другим вопросам не стесняйтесь спрашивать меня.

Заранее большое спасибо!


Обновление /Решение : Решена проблема с помощью следующего фрагмента кода:

months = 0.0

months += ((date_to < date_from.end_of_month ? date_to : date_from.end_of_month) - date_from + 1) / Time.days_in_month(date_from.month)
unless date_to.month == date_from.month
  months += (date_to - date_to.beginning_of_month + 1) / Time.days_in_month(date_to.month)
  months += date_to.month - date_from.month - 1
end

return months.floor_to(2)

1 Ответ

1 голос
/ 27 августа 2011

лучшим способом будет суммирование

  • количества дней, оставшихся с / количество дней с
  • количества дней, завершенных до / количество дней вдо
  • количество месяцев от и до (от, до исключенных)

Таким образом, у вас не будет итераций для выполнения

...