如果我有一个流程,我想在本月的某个特定日期运行。每个月计算周年纪念日的最佳方式是什么? 例如,如果我想在每月30日向某人收费。
我知道我可以安装GEM,但这看起来有些过分。此外,Date#>>
方法仅适用于计算下个月。那之后的一个月呢?
我在下面发布了我的代码,这是我提出的最佳解决方案。
答案 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