Вычитание Рубиновой Даты (например, 90 дней назад) - PullRequest
83 голосов
/ 02 марта 2011

Я был немного испорчен API времени joda:

DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);

Я пытаюсь сделать то же самое в Ruby, но я

now = Time.now
ninetyDaysAgo = now - (90*24)

Однако математика здесь не работает (я действительно работаю с датами в полночь).

Есть ли дружественный API для вычитания даты?

Ответы [ 6 ]

95 голосов
/ 02 марта 2011
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

12 голосов
/ 14 мая 2013

Для тех, кто использует 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
10 голосов
/ 02 марта 2011

Если вы используете Rails или не возражаете против включения ActiveSupport, вы можете использовать Числовой # дней 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)> 
8 голосов
/ 21 марта 2015

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" 

Используйте методы # << </a> и # >> для работы с месяцами, а не с днями. Арифметика по месяцам немного отличается от арифметики по дням. Использование Date вместо DateTime делает эффект более очевидным.

 > (Date.new(2015, 5, 31) << 3).to_s  # May 31 - 3 months; 92 days diff
 => "2015-02-28" 

Следуя примеру joda-time, вы можете написать что-то подобное в Ruby.

now =  DateTime.now
ninety_days_ago = now - 90

или, может быть, просто

ninety_days_ago = DateTime.now - 90
5 голосов
/ 08 февраля 2017

используйте количество секунд:

Time.now - 90*24*60*60
4 голосов
/ 26 июля 2014

Это очень старая запись, но если вы хотите сохранить объект Time, как это было первоначально предложено, вместо того, чтобы переключаться на объект Date, вы можете использовать Ruby Facets.

Ruby Facets - это стандартизированная библиотека расширений для основных классов Ruby.

http://rubyworks.github.io/facets/

Требуя Facets, вы можете затем делать следующее с объектами Time.

Time.now.less(90, :days)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...