Trochę mnie rozpieszczało API czasu joda:
DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);
Próbuję zrobić coś podobnego w Rubim, ale jestem
now = Time.now
ninetyDaysAgo = now - (90*24)
Jednak matematyka jest tutaj wyłączona (naprawdę pracuję z datami o północy).
Czy istnieje przyjazny interfejs API do odejmowania dat?
Date
pozwala również na ułamki, więc możesz to zrobićDate.today - (90.0/24.0)
. Wynik można łatwo przekonwertowaćto_datetime
lubto_time
też.Dla tych, którzy używają Railsów, sprawdź:
DateTime.now - 10.days => Sat, 04 May 2013 12:12:07 +0300 20.days.ago - 10.days => Sun, 14 Apr 2013 09:12:13 UTC +00:00
źródło
Jeśli używasz Railsów lub nie masz nic przeciwko dołączeniu ActiveSupport, możesz użyć Numeric # days DSL w następujący sposób:
ruby-1.9.2-p136 :002 > Date.today => Wed, 02 Mar 2011 ruby-1.9.2-p136 :003 > Date.today - 90.days => Thu, 02 Dec 2010
Ponieważ pracujesz z datami zamiast godzinami, powinieneś również zacząć od wystąpień Date lub przekonwertować swoje intencje DateTime za pomocą #to_date. Podczas dodawania / odejmowania liczb z wystąpień dat liczby są niejawnie dniami.
ruby-1.9.2-p136 :016 > DateTime.now.to_date => #<Date: 2011-03-02 (4911245/2,0,2299161)> ruby-1.9.2-p136 :017 > DateTime.now.to_date - 90 => #<Date: 2010-12-02 (4911065/2,0,2299161)>
źródło
Ruby obsługuje arytmetykę dat w klasach Date i DateTime , które są częścią standardowej biblioteki Rubiego. Obie te klasy udostępniają metody # + i # - , które dodają i odejmują dni od daty lub godziny.
$ irb > require 'date' => true > (DateTime.new(2015,4,1) - 90).to_s # Apr 1, 2015 - 90 days => "2015-01-01T00:00:00+00:00" > (DateTime.new(2015,4,1) - 1).to_s # Apr 1, 2015 - 1 day => "2015-03-31T00:00:00+00:00"
Użyj metod # << i # >> , aby operować na miesiącach zamiast dni. Arytmetyka miesięcy różni się nieco od arytmetyki dni. Użycie Date zamiast DateTime sprawia, że efekt jest bardziej oczywisty.
> (Date.new(2015, 5, 31) << 3).to_s # May 31 - 3 months; 92 days diff => "2015-02-28"
Idąc za przykładem czasu joda, możesz napisać coś takiego w Rubim.
now = DateTime.now ninety_days_ago = now - 90
a może po prostu
ninety_days_ago = DateTime.now - 90
źródło
To jest bardzo stary post, ale jeśli chcesz pozostać przy
Time
obiekcie, tak jak pierwotnie o to pytano, zamiast przełączać się naDate
obiekt, którego możesz chcieć rozważyćRuby Facets
.Ruby Facets to ustandaryzowana biblioteka rozszerzeń dla podstawowych klas Rubiego.
http://rubyworks.github.io/facets/
Wymagając Facets, możesz następnie wykonać następujące czynności z obiektami Time.
Time.now.less(90, :days)
źródło
użyj liczby sekund:
Time.now - 90*24*60*60
źródło
Proste rozwiązanie:
days90_ago = 90.days.ago.to_date.to_s OUTPUT: puts 90_days_ago => "2019-10-09" # considering cur_date: 2020-01-07
źródło