Если вы используете объект Time
, вы можете использовать Time.to_a
, чтобы разбить время на массив (с полями, представляющими час, день, месяц и т. Д.), Настроить соответствующее поле и передать массив обратно. на Time.local
или Time.utc
для создания нового Time
объекта.
Если вы используете класс Date
, date +/- n
даст вам дату n дней спустя / раньше, а date >>/<< n
даст вам дату n месяцев позже / раньше.
Вы можете использовать более общий Date.step
вместо вашего цикла. Например,
from_date.step(Date.today, interval) {|d|
# Each iteration of this block will be passed a value for 'd'
# that is 'interval' days after the previous 'd'.
}
, где interval
- промежуток времени в днях.
Если все, что вы делаете, это вычисление прошедшего времени, то, вероятно, есть лучший подход к этому. Если ваша дата хранится как объект Date
, выполнение date - Date.today
даст вам количество дней между этой датой и временем. Для расчета месяцев, лет и т. Д. Вы можете использовать что-то вроде этого:
# Parameter 'old_date' must be a Date object
def months_since(old_date)
(Date.today.month + (12 * Date.today.year)) - (old_date.month + (12 * old_date.year))
end
def years_since(old_date)
Date.today.year - old_date.year
end
def days_since(old_date)
Date.today - old_date
end