Necesité el número exacto de meses (incluyendo decimales) entre dos fechas y escribí el siguiente método para ello.
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
Si lo comparamos digamos del 26 de septiembre al 26 de septiembre (el mismo día) lo calculo como 1 día. Si no es necesario que usted puede quitar la primera línea en el método: period_end = period_end + 1.day
Pasa a las siguientes especificaciones:
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
Se basa en ActiveSupport Rails.
Me gusta este, pero suena un poco tedioso codificar. ._. – omninonsense
DateTime y Date son algo intercambiables usando los métodos 'DateTime # to_date' y' Date # to_datetime'. – tadman
Quizás, [una pregunta similar sobre años] (http://stackoverflow.com/questions/1904097/how-to-calculate-how-many-years-passed-since-a-given-date-in-ruby) podría ¿ayudarte? –