Я был немного испорчен API joda-time:
DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);
Я пытаюсь проделать то же самое в Ruby, но я
now = Time.now
ninetyDaysAgo = now - (90*24)
Однако здесь нет математики (я действительно работаю с датами в полночь).
Есть ли удобный API для вычитания даты?
Date
также позволяет использовать дробиDate.today - (90.0/24.0)
. Результат может быть легко преобразованto_datetime
илиto_time
тоже.Тем, кто использует 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
источник
Если вы используете 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)>
источник
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
источник
Это очень старый пост, но если вы хотите сохранить
Time
объект, как изначально было предложено, вместо того, чтобы переключаться наDate
объект, вы, возможно, захотите использовать егоRuby Facets
.Ruby Facets - это стандартизированная библиотека расширений для основных классов Ruby.
http://rubyworks.github.io/facets/
Требуя Facets, вы можете делать следующее с объектами Time.
Time.now.less(90, :days)
источник
используйте количество секунд:
Time.now - 90*24*60*60
источник
Простое решение:
days90_ago = 90.days.ago.to_date.to_s OUTPUT: puts 90_days_ago => "2019-10-09" # considering cur_date: 2020-01-07
источник