鉴于Ruby日期,是否存在用于计算该日期的下一个周年纪念日的一个班轮?
例如,如果日期是2011年5月1日,则下一个周年纪念日将是2012年5月1日,但如果是2011年12月1日,则下一个周年纪念日是2011年12月1日(因为该日期尚未到达) )。
答案 0 :(得分:2)
如果date
变量是Date
的实例,那么您可以使用>>
:
返回比当前日期晚n个月的新Date对象。
所以你可以这样做:
one_year_later = date >> 12
同样的方法适用于DateTime。如果您拥有的只是一个字符串,那么您可以使用parse
方法:
next_year = Date.parse('May 01, 2011') >> 12
next_year_string = (Date.parse('May 01, 2011') >> 12).to_s
恕我直言你最好尽可能多地使用日期库(日期和日期时间),但如果你知道Rails总是在你身边或者你不喜欢你可以使用Rails扩展(例如1.year
)不用担心根据需要手动拉入active_support。
答案 1 :(得分:1)
你可以使用Ruby的Date类来完成它:
the_date = Date.parse('jan 1, 2011')
(the_date < Date.today) ? the_date + 365 : the_date # => Sun, 01 Jan 2012
the_date = Date.parse('dec 31, 2011')
(the_date < Date.today) ? the_date.next_year : the_date # => Sat, 31 Dec 2011
或者,为方便起见,请使用ActiveSupport的Date class extensions:
require 'active_support/core_ext/date/calculations'
the_date = Date.parse('jan 1, 2011')
(the_date < Date.today) ? the_date.next_year : the_date # => Sun, 01 Jan 2012
the_date = Date.parse('dec 31, 2011')
(the_date < Date.today) ? the_date.next_year : the_date # => Sat, 31 Dec 2011
答案 2 :(得分:1)
这样做的优秀宝石称为复发。您可以查看源代码或一些示例:
例如,如果您设置了date
,则可以尝试:
date = ...
recurrence = Recurrence.new(every: :year, on: [date.month, date.day])
puts recurrence.next
答案 3 :(得分:0)
试试这个:
def next_anniversary(d)
Date.today > d ? 1.year.from_now(d) : d
end
答案 4 :(得分:-1)
为了做到这一点而拉入宝石是一种矫枉过正的行为。
your_date > Date.today ? your_date : your_date >> 12