Antworten:
Subtrahieren Sie das Anfangsdatum vom Enddatum:
endDate - beginDate
DateTime
Objekt haben, müssen Sie es Date
zuerst konvertieren , andernfalls wird die Anzahl der Sekunden zurückgegeben (ich denke).
Date
Sie auch, Rational
dass Sie durch Subtrahieren von zwei Objekten möglicherweise eine Ganzzahl (endDate - beginDate).to_i
irb(main):005:0> a = Date.parse("12/1/2010")
=> #<Date: 4911063/2,0,2299161>
irb(main):007:0> b = Date.parse("12/21/2010")
=> #<Date: 4911103/2,0,2299161>
irb(main):016:0> c = b.mjd - a.mjd
=> 20
Dies verwendet eine modifizierte julianische Tagesnummer .
Aus Wikipedia :
Das julianische Datum (JD) ist das Zeitintervall in Tagen und Bruchteilen eines Tages seit dem 1. Januar 4713 v. Chr. Greenwich-Mittag, julianischer proleptischer Kalender.
Dies hat sich möglicherweise in Ruby 2.0 geändert
Wenn ich das mache, bekomme ich einen Bruchteil. Zum Beispiel auf der Konsole (entweder irb oder Schienen c)
2.0.0-p195 :005 > require 'date'
=> true
2.0.0-p195 :006 > a_date = Date.parse("25/12/2013")
=> #<Date: 2013-12-25 ((2456652j,0s,0n),+0s,2299161j)>
2.0.0-p195 :007 > b_date = Date.parse("10/12/2013")
=> #<Date: 2013-12-10 ((2456637j,0s,0n),+0s,2299161j)>
2.0.0-p195 :008 > a_date-b_date
=> (15/1)
Natürlich ergibt das Casting auf ein int das erwartete Ergebnis
2.0.0-p195 :009 > (a_date-b_date).to_i
=> 15
Dies funktioniert auch für DateTime-Objekte, Sie müssen jedoch Sekunden berücksichtigen, wie in diesem Beispiel
2.0.0-p195 :017 > a_date_time = DateTime.now
=> #<DateTime: 2013-12-31T12:23:03-08:00 ((2456658j,73383s,725757000n),-28800s,2299161j)>
2.0.0-p195 :018 > b_date_time = DateTime.now-20
=> #<DateTime: 2013-12-11T12:23:06-08:00 ((2456638j,73386s,69998000n),-28800s,2299161j)>
2.0.0-p195 :019 > a_date_time - b_date_time
=> (1727997655759/86400000000)
2.0.0-p195 :020 > (a_date_time - b_date_time).to_i
=> 19
2.0.0-p195 :021 > c_date_time = a_date_time-20
=> #<DateTime: 2013-12-11T12:23:03-08:00 ((2456638j,73383s,725757000n),-28800s,2299161j)>
2.0.0-p195 :022 > a_date_time - c_date_time
=> (20/1)
2.0.0-p195 :023 > (a_date_time - c_date_time).to_i
=> 20
In Ruby 2.1.3 haben sich folgende Dinge geändert:
> endDate = Date.new(2014, 1, 2)
=> #<Date: 2014-01-02 ((2456660j,0s,0n),+0s,2299161j)>
> beginDate = Date.new(2014, 1, 1)
=> #<Date: 2014-01-01 ((2456659j,0s,0n),+0s,2299161j)>
> days = endDate - beginDate
=> (1/1)
> days.class
=> Rational
> days.to_i
=> 1
Wie wäre es damit?
(beginDate...endDate).count
Die Reihe besteht aus einer Reihe einzigartiger Serien. Und ...
ist ein exklusives Range-Literal.
So beginDate..(endDate - 1)
ist es auch. Außer ist nicht.
Wenn beginDate gleich endDate ist , wird das erste Element aufgrund der Eindeutigkeit ausgeschlossen und ...
das letzte ausgeschlossen. Wenn wir also .count
zwischen heute und heute datieren möchten, wird 0 zurückgegeben.
0
, was in einigen Fällen perfekt funktioniert. Wenn die beiden Daten identisch sind, wird 0 zurückgegeben. Außerdem wird eine einfache Ganzzahl zurückgegeben. Andere Antworten müssen in ganze Zahlen umgewandelt werden, oder Sie müssen möglicherweise in 0 übersetzen, wenn das Ergebnis negativ ist.
Versuche dies:
num_days = later_date - earlier_date
All dies führte mich zum richtigen Ergebnis, aber ich endete damit
DateTime.now.mjd - DateTime.parse("01-01-1995").mjd
YYYY-MM-DD
Format, was sowieso jeder verwenden sollte.
Tage = (endDate - beginDate) / (60 * 60 * 24)