如何计算下一年度日期?

时间:2011-06-04 19:42:26

标签: ruby-on-rails ruby

鉴于Ruby日期,是否存在用于计算该日期的下一个周年纪念日的一个班轮?

例如,如果日期是2011年5月1日,则下一个周年纪念日将是2012年5月1日,但如果是2011年12月1日,则下一个周年纪念日是2011年12月1日(因为该日期尚未到达) )。

5 个答案:

答案 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