Ich habe zwei Ruby on Rails DateTime-Objekte. Wie finde ich die Anzahl der Monate zwischen ihnen? (Denken Sie daran, dass sie zu verschiedenen Jahren gehören könnten)
ruby-on-rails
ruby
date
ruby-on-rails-3.1
Phönixzauberer
quelle
quelle
Antworten:
Weitere Informationen unter http://www.ruby-forum.com/topic/72120
quelle
(12 * (date2.year - date1.year) + date2.month - date1.month).abs if date1 && date2
Eine genauere Antwort würde Tage in der Ferne berücksichtigen.
Zum Beispiel, wenn Sie , dass der Monat Abstand betrachten aus
28/4/2000
und1/5/2000
ist0
nicht1
, dann können Sie:quelle
Probieren Sie es aus
quelle
irb>Time.at("2014-10-01".to_time - "2014-12-01".to_time).month => 10
(Ich gebe die Formatierung auf ... kann es nicht herausfinden)Date.new(2014, 10, 31), Date.new(1997, 4, 30)
erhielt ich 213 statt 210 Monate. Der Grund dafür ist, dass1.month.seconds
die Anzahl der Sekunden in 30 Tagen und nicht die durchschnittlichen Sekunden in einem Monat sind. Downvoting, damit andere fehlerfrei bleiben.Sie können die Frage wie folgt umformulieren: "Wie viele erste Tage liegen zwischen den Anfängen der Monate der Daten?" Und dann Datentransformationen im funktionalen Stil verwenden:
quelle
Angenommen, beide sind Daten:
((date2 - date1).to_f / 365 * 12).round
einfach.quelle
((date2 - date1).to_f / 60 / 60 / 24 / 365 * 12).round
quelle
Eine andere Lösung, die ich gefunden habe (basierend auf einer hier bereits veröffentlichten Lösung), ist für den Fall, dass das Ergebnis Bruchteile eines Monats enthalten soll. Zum Beispiel ist die Entfernung
1.2 months
.quelle
quelle
Ich brauchte die genaue Anzahl von Monaten (einschließlich Dezimalstellen) zwischen zwei Daten und schrieb die folgende Methode dafür.
Wenn wir den 26. September mit dem 26. September (am selben Tag) vergleichen, berechne ich ihn als 1 Tag. Wenn Sie das nicht benötigen, können Sie die erste Zeile in der Methode entfernen:
period_end = period_end + 1.day
Es besteht die folgenden Spezifikationen:
quelle
Hier ist eine Brute-Forcing-Variante:
date2
muss immer größer sein alsdate1
quelle
Hier ist eine andere Methode. Dies hilft bei der Berechnung der Anzahl ganzer Monate zwischen zwei Daten
quelle