Вычитание даты Ruby (например, 90 дней назад)
Я был немного испорчен API-интерфейсом joda-времени:
DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);
Я пытаюсь сделать подобное в Ruby, но я
now = Time.now
ninetyDaysAgo = now - (90*24)
Однако математика отключена (я действительно работаю с датами в полночь).
Есть ли дружественный API для вычитания даты?
Ответы
Ответ 1
require 'date'
now = Date.today
ninety_days_ago = (now - 90)
Запустив это через консоль IRB, я получаю:
<Суб >
>>require 'date'
now = Date.today
ninety_days_ago = (now - 90)
require 'date'
=> false
now = Date.today
=> #<Date: 2011-03-02 (4911245/2,0,2299161)>
ninety_days_ago = (now - 90)
=> #<Date: 2010-12-02 (4911065/2,0,2299161)>
суб > Если вам нужно время, вы можете просто сказать now = DateTime.now
Ответ 2
Если вы используете Rails или не возражаете, включая ActiveSupport, вы можете использовать числовые # days DSL следующим образом:
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
Поскольку вы работаете с датами, а не раз, вам также следует начинать с экземпляров Date или конвертировать ваши даты DateTime С#to_date. При добавлении/вычитании чисел из экземпляров даты числа неявно являются днями.
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)>
Ответ 3
Для тех, кто использует Rails, проверьте следующее:
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
Ответ 4
Ruby поддерживает арифметику даты в классах Date и DateTime, которые являются частью стандартной библиотеки Ruby. Оба этих класса выставляют # + и # - методы, которые добавлять и вычитать дни с даты или времени.
$ 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"
Используйте # < < и # " > методы для работы в месяцах вместо дней. Арифметика по месяцам немного отличается от арифметики по дням. Использование Date вместо DateTime делает эффект более очевидным.
> (Date.new(2015, 5, 31) << 3).to_s # May 31 - 3 months; 92 days diff
=> "2015-02-28"
Следуя примеру joda-времени, вы можете написать что-то подобное в Ruby.
now = DateTime.now
ninety_days_ago = now - 90
или, может быть, просто
ninety_days_ago = DateTime.now - 90
Ответ 5
Это супер старое сообщение, но если вы хотите сохранить объект Time
, как первоначально было задано, вместо перехода на объект Date
, который вы, возможно, захотите рассмотреть, используя Ruby Facets
.
Ruby Facets - стандартизованная библиотека расширений для основных классов Ruby.
http://rubyworks.github.io/facets/
Посредством запроса Facets вы можете сделать следующее с объектами Time.
Time.now.less(90, :days)
Ответ 6
используйте количество секунд:
Time.now - 90*24*60*60