如何选择本月的下一个十月红宝石

时间:2018-10-08 19:20:31

标签: ruby validation date datetime ruby-on-rails-4

我遇到了日期计算问题,这使我的逻辑混乱。

我有一个接受银行帐户借记付款的应用程序,该费用必须在要付款的日期的至少三天之前产生。

我需要在当月的下一个第十天接机,这可能是当月或下个月,具体取决于当日。

例如,今天是10月7日,我需要获得第二天的10,只要从今天开始的间隔为三天,在这种情况下,我需要在10月10日返回。

但是如果今天是10月8日,我需要拿起下一个10,在这种情况下,我需要在11月10日返回。

在Ruby中最好的解决方案是什么?

3 个答案:

答案 0 :(得分:4)

另一个选择:

def next_10th_deadline_from date
  deadline = Date.new(date.year, date.month, 10)
  deadline = deadline.next_month if (deadline - date) < 3
  deadline
end


或者,如果输入字符串和输出字符串:

def next_10th_deadline_from date
  date = Date.parse date
  deadline = Date.new(date.year, date.month, 10)
  deadline = deadline.next_month if (deadline - date) < 3
  deadline.to_s
end

next_10th_deadline_from '2018-12-07' #=> "2018-12-10"
next_10th_deadline_from '2018-12-08' #=> "2019-01-10"

上班require 'date'

答案 1 :(得分:3)

您可以使用类似这样的内容:

def next_10th(date)
  year, month, day = date.year, date.month, date.day

  month += 1 if day > 7
  year += 1 if month > 12

  Date.new(year, (month - 1) % 12 + 1, 10)
end

next_10th(Date.new(2017, 11, 7)).to_s
#=> "2017-11-10"

next_10th(Date.new(2017, 11, 8)).to_s
#=> "2017-12-10"

next_10th(Date.new(2017, 11, 10)).to_s
#=> "2017-12-10"

next_10th(Date.new(2017, 12, 8)).to_s
#=> "2018-01-10"

答案 2 :(得分:2)

您可以使用红宝石中的lazy enumerator查找从今天开始的下一个有效日期。

(Date.today..Date::Infinity.new)
  .lazy
  .find { |date| date.day == 7 }
  .next_day(3)