到目前为止,这是一个非常重要的任务。我想要做的是找出两个日期范围之间的日期范围有多少个月......我知道我现在听起来像是Yoda,但让我告诉你我想要完成的事情。
financial_year_2014 = Date.new(2014,6,29)..Date.new(2015,6,30)
financial_year_2015 = Date.new(2015,6,29)..Date.new(2016,6,30)
现在我有一张记分卡,每月奖励你financial_year_2014
每月1点,每月2点积分financial_year_2015
因此,如果您的记分卡begin_date
和end_date
都在financial_year_2014
范围内,您可以更轻松地执行此类操作
#Does date fall in range method
financial_year_2014.include?(scorecard.begin_date..scorecard.end_date)
如果它适合那段时间,那么它将返回true,那么你可以用以下数字计算月份:
((scorecard.end_date.year * 12 + scorecard.end_date.month) - (scorecard.begin_date.year * 12 + scorecard.begin_date.month)) * financial_year_2014_points
但是现在我得到的是,如果begin_date
是五月而end_date
是八月,那么两个财政年度之间的记分卡begin_date和end_date会交叉。然后,您将在2014财年获得2个月,在2015年获得2个月。然后,您将在2014年每月获得1分,2015年每月获得2分,在此示例中总共获得6分。
上述示例中的#does date fall in range method
即使2个月落在范围内也不会通过。任何人都知道如何完成此操作,或者是否有任何宝石更好地处理这样的日期和范围。
答案 0 :(得分:2)
您可以查看以下日期范围内的月份:
require 'date'
((Date.today - 90)..Date.today).map{|d| [d.month]}.uniq
要检查范围是否包含其他范围,您可以使用此选项:
a = ((Date.today - 90)..Date.today)
b = ((Date.today-10)..(Date.today-5))
(a.to_a & b.to_a).empty? # false if includes
请注意,它会比较Range的每个成员。
答案 1 :(得分:1)
好吧,我不是100%确定您的代码是如何设置的,但我会做的就是这样:
if financial_year_2014.include?(scorecard.begin_date..scorecard.end_date) || financial_year_2015.include?(scorecard.begin_date..scorecard.end_date)
#calculate based on 2014/2015 year only
else
#calculate based on split between the years
range_one = scorecard.begin_date..Date.new(2015,6,30)
range_two = Date.new(2015,6,30)..scorecard.end_date
#use new ranges to calculate
end