我遇到了日期计算问题,这使我的逻辑混乱。
我有一个接受银行帐户借记付款的应用程序,该费用必须在要付款的日期的至少三天之前产生。
我需要在当月的下一个第十天接机,这可能是当月或下个月,具体取决于当日。
例如,今天是10月7日,我需要获得第二天的10,只要从今天开始的间隔为三天,在这种情况下,我需要在10月10日返回。
但是如果今天是10月8日,我需要拿起下一个10,在这种情况下,我需要在11月10日返回。
在Ruby中最好的解决方案是什么?
答案 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)