如何计算下一个月度周年纪念日

时间:2018-01-22 14:47:29

标签: ruby-on-rails ruby

如果我有一个流程,我想在本月的某个特定日期运行。每个月计算周年纪念日的最佳方式是什么? 例如,如果我想在每月30日向某人收费。

我知道我可以安装GEM,但这看起来有些过分。此外,Date#>>方法仅适用于计算下个月。那之后的一个月呢?

我在下面发布了我的代码,这是我提出的最佳解决方案。

3 个答案:

答案 0 :(得分:1)

根据您自己的答案,这也可行:

def next_month_anniversary(mday, today = Date.today)
  d = today.next_month
  if Date.valid_date?(d.year, d.month, mday)
    Date.new(d.year, d.month, mday)
  else
    Date.new(d.year, d.month, -1)
  end
end

或者更加浓缩:

def next_month_anniversary(mday, today = Date.today)
  d = today.next_month
  mday = -1 unless Date.valid_date?(d.year, d.month, mday)
  Date.new(d.year, d.month, mday)
end

示例:

next_month_anniversary(30, Date.new(2018, 1, 31))
#=> #<Date: 2018-02-28 ...>

答案 1 :(得分:0)

这是我能够提出的最佳解决方案。在这种情况下,它是1月31日,我想在每月30日返回一个周年纪念日。

> MyClass.next_month_anniversary(30, '2018-01-30'.to_date)
 => Wed, 28 Feb 2018    

以下是代码:

  def next_month_anniversary(day_of_month, today = Date.today)
    month = (today >> 1).month
    year =  (today >> 1).year
    days_in_month = Time.days_in_month(month.to_i, year.to_i)
    if days_in_month < day_of_month
      day = days_in_month
    else
      day = day_of_month
    end
    Date.new(year.to_i, month.to_i, day.to_i)
  end

答案 2 :(得分:0)

你应该使用提前

https://apidock.com/rails/DateTime/advance

Date.current.advance(months: 2)   

根据评论进行修改:在初始日期调用提前知道将来发生的事件

 my_date = Date.new(2018, 1, 30) #example but mean to be the date you set up as to be recurrent
 my_date.advance(months:1) #Wed, 28 Feb 2018