myślisz, że masz na myśli odjęcie daty rozpoczęcia od daty końcowej :)
Nader
99
rodzaj antyklimaktyczny, co?
Brig
18
Uwaga: jeśli używasz Wirble w irb (do pokolorowania wyjścia), liczba wymierna będzie miała 1 dołączoną do końca. yikes! możesz użyć to_i, aby przekonwertować wynik na liczbę całkowitą
jwal
9
Jeśli masz DateTimeobiekt, pamiętaj, aby przekonwertować go na Datepierwszy, w przeciwnym razie zwraca liczbę sekund (chyba).
Joshua Muheim
44
zwróć również uwagę, że odejmowanie dwóch Dateobiektów daje Ci Rational, że może być konieczne wpisanie do liczby całkowitej, tak jak w przypadku(endDate - beginDate).to_i
MusikAnimal
98
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
The Range to zestaw unikalnych seriali. I ...to ekskluzywny dosłowny zakres.
Tak beginDate..(endDate - 1)jest. Z wyjątkiem nie jest.
W przypadku, gdy wartość beginDate równa się endDate , pierwszy element zostanie wykluczony ze względu na unikalność i ...wykluczy ostatni. Więc jeśli chcemy .countdatować od dzisiaj do dzisiaj, zwróci 0.
To bardzo dobra odpowiedź, jeśli beginDate jest starsza niż endDate, zwróci 0, co działa doskonale w niektórych przypadkach. Ponadto, jeśli dwie daty są takie same, zwróci 0. Zwraca również zwykłą liczbę całkowitą. Inne odpowiedzi należy przekształcić na liczby całkowite lub może być konieczne przetłumaczenie na 0, jeśli wynik jest ujemny.
Jedna ciekawostka na uwagę: DateTime.parse w Rubim oczekuje, że data zostanie podana jako DD / MM / RRRR lub DD-MM-RRRR. Jako Amerykanin zawsze mnie to wyrzuca!
rickumali
15
@rickumali Jako członek z reszty świata, dziękuję Ruby za użycie „naszego” domyślnego formatu daty.
Claudio Holanda
7
@rickumali Ruby akceptuje również datę w YYYY-MM-DDformacie, którego i tak każdy powinien używać.
Data jest wyrażona w dniach, więc nie musisz tego robić. Myślę, że Twoje rozwiązanie staje się istotne dzięki różnicom między datami i godzinami.
suga_shane
1
Cóż, zadbaj też o to, co masz na myśli, mówiąc „pomiędzy” ...
days_apart =(to - from).to_i # from + days_apart = to
total_days =(to - from).to_i +1# number of "selected" days
in_between_days =(to - from).to_i -1# how many days are in between from and to, i.e. excluding those two days
DateTime
obiekt, pamiętaj, aby przekonwertować go naDate
pierwszy, w przeciwnym razie zwraca liczbę sekund (chyba).Date
obiektów daje CiRational
, że może być konieczne wpisanie do liczby całkowitej, tak jak w przypadku(endDate - beginDate).to_i
Wykorzystuje zmodyfikowany numer dnia juliańskiego .
Z Wikipedii :
źródło
Mogło się to zmienić w Ruby 2.0
Kiedy to robię, dostaję ułamek. Na przykład na konsoli (irb lub rails c)
Oczywiście rzutowanie na int daje oczekiwany rezultat
Działa to również w przypadku obiektów DateTime, ale musisz wziąć pod uwagę sekundy, takie jak ten przykład
źródło
W Ruby 2.1.3 rzeczy się zmieniły:
źródło
Co powiesz na to?
The Range to zestaw unikalnych seriali. I
...
to ekskluzywny dosłowny zakres.Tak
beginDate..(endDate - 1)
jest. Z wyjątkiem nie jest.W przypadku, gdy wartość beginDate równa się endDate , pierwszy element zostanie wykluczony ze względu na unikalność i
...
wykluczy ostatni. Więc jeśli chcemy.count
datować od dzisiaj do dzisiaj, zwróci 0.źródło
0
, co działa doskonale w niektórych przypadkach. Ponadto, jeśli dwie daty są takie same, zwróci 0. Zwraca również zwykłą liczbę całkowitą. Inne odpowiedzi należy przekształcić na liczby całkowite lub może być konieczne przetłumaczenie na 0, jeśli wynik jest ujemny.To zadziałało dla mnie:
źródło
Spróbuj tego:
źródło
wszystko to doprowadziło mnie do właściwego wyniku, ale skończyło się na tym
źródło
YYYY-MM-DD
formacie, którego i tak każdy powinien używać.days = (endDate - beginDate) / (60 * 60 * 24)
źródło
Cóż, zadbaj też o to, co masz na myśli, mówiąc „pomiędzy” ...
źródło