Tenho dois objetos DateTime do Ruby on Rails. Como saber o número de meses entre eles? (Tendo em mente que eles podem pertencer a anos diferentes)
ruby-on-rails
ruby
date
ruby-on-rails-3.1
feiticeiro da fênix
fonte
fonte
Respostas:
mais informações em http://www.ruby-forum.com/topic/72120
fonte
(12 * (date2.year - date1.year) + date2.month - date1.month).abs if date1 && date2
Uma resposta mais precisa consideraria dias distantes.
Por exemplo, se você considerar que a distância do mês de
28/4/2000
e1/5/2000
é em0
vez de1
, então você pode usar:fonte
Experimente
fonte
irb>Time.at("2014-10-01".to_time - "2014-12-01".to_time).month => 10
(Desisto de formatação ... não consigo descobrir)Date.new(2014, 10, 31), Date.new(1997, 4, 30)
, recebi 213 em vez de 210 meses. A razão para isso é que1.month.seconds
é o número de segundos em 30 dias e não a média de segundos em um mês. Downvoting para que outros fiquem livres de erros.Você pode reformular a pergunta como "quantos primeiros dias existem entre o início dos meses das datas" e, em seguida, usar transformações de dados de estilo funcional:
fonte
Supondo que ambos sejam datas:
((date2 - date1).to_f / 365 * 12).round
simples.fonte
((date2 - date1).to_f / 60 / 60 / 24 / 365 * 12).round
fonte
Outra solução que encontrei (construída a partir de uma solução já postada aqui) é se você quiser que o resultado inclua frações de um mês. Por exemplo, a distância é
1.2 months
.fonte
fonte
Eu precisava do número exato de meses (incluindo decimais) entre duas datas e escrevi o seguinte método para isso.
Se comparar, digamos de 26 de setembro a 26 de setembro (mesmo dia), calculo como 1 dia. Se você não precisa disso, pode remover a primeira linha do método:
period_end = period_end + 1.day
Ele passa nas seguintes especificações:
fonte
Aqui está uma variante de força bruta:
date2
deve ser sempre maior quedate1
fonte
Aqui está outro método. Isso ajudará a calcular o número de meses inteiros entre duas datas
fonte