Вычитание рубиновой даты (например, 90 дней назад)

89

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

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

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

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

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

Есть ли удобный API для вычитания даты?

Дартревино
источник

Ответы:

105
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

Мэтт
источник
Ваш исходный пост с предварительным редактированием был ближе к тому, что мне было нужно, но Date.Now был защищен. Date.today работал. Если вы измените свое первое рекламное объявление на строку now = Date.today, я приму ее.
darthtrevino 02
3
@Matt: а как вычесть 90 часов вместо дней?
Эстебан Фельдман
@EstebanFeldman Dateтакже позволяет использовать дроби Date.today - (90.0/24.0). Результат может быть легко преобразован to_datetimeили to_timeтоже.
jchook 01
15

Тем, кто использует 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

Если вы используете Rails или не возражаете против ActiveSupport, вы можете использовать Numeric # 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)> 
Гейб Мартин-Демпеси
источник
8

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-time, вы могли бы написать что-то подобное на 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)

Bigtunacan
источник
Этот проект не обновлялся в течение двух лет и обнаружил проблемы с одним комментарием. Он мертв.
user4674453 07
@ user4674453 Последнее обновление было полгода назад. Это стабильная библиотека, которая все еще работает с последней версией Ruby. Не все кодовые базы нужно обновлять ежедневно, чтобы не считаться «мертвыми».
bigtunacan
5

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

Time.now - 90*24*60*60
Рубин
источник
-1

Простое решение:

days90_ago = 90.days.ago.to_date.to_s

OUTPUT:
puts 90_days_ago
=> "2019-10-09" # considering cur_date: 2020-01-07
Равистм
источник
Это использует ActiveSupport (Rails).
Эспен