Рубиновое вычитание даты (например, 90 дней назад)
Я был немного испорчен API joda-time:
DateTime now = new DateTime();
DateTime ninetyDaysAgo = now.minusDays(90);
Я пытаюсь сделать то же самое в Ruby, но я
now = Time.now
ninetyDaysAgo = now - (90*24)
однако математика здесь выключена (я действительно работаю с датами в полночь).
есть ли дружественный API для вычитания даты?
6 ответов:
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
Если вы используете 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Так как вы работаете с датами вместо времени, вы также должны либо начать с экземпляров даты, либо конвертировать ваши datetime intances с #to_date. При добавлении / вычитании чисел из экземпляров 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)>
для тех, кто использует рельсы, проверьте следующее:
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
Ruby поддерживает арифметику даты в классы даты и времени, которые являются частью стандартной библиотеки 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.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/
путем требовать фасетов вы можете после этого сделать следующее с объектами времени.
Time.now.less(90, :days)
Comments