2014-09-19 178 views
0

迄今为止这是一项相当艰巨的任务。我想要做的是找出两个日期范围之间的日期范围有多少个月..我知道我现在听起来像尤达,但让我更愿意告诉你我想要完成的事情。在日期范围内计算日期范围中的月份的轨迹

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) 

现在我有一个记分卡,每月1点你在financial_year_2014,每月2点,你是在financial_year_2015

所以,如果你的记分卡begin_dateend_date都属于该financial_year_2014内的奖励它更容易在那里你可以做这样的事情

#Does date fall in range method 
financial_year_2014.include?(scorecard.begin_date..scorecard.end_date) 

,如果它适合在该期限内,然后这些返回true,那么你可以指望一个月s的:

((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是在8月。那么你将在2014财政年度有2个月,在2015年有2个月。您将在2014年每月获得1分,2015年每月获得2分,本例中总共为6分。

上述示例中的#does date fall in range method即使2个月落入该范围内也不会通过。任何人都有一个想法,我该如何完成此操作,或者是否有任何处理日期和范围的gem这个更好。

回答

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 
+0

是的,这是我如何使它结构相似,我遇到的问题是找到计分卡可以落入每个范围的月数的方法 - 如果它确实落在两个范围之间financial_year_2014.include?方法将返回false – TheLegend 2014-09-19 14:38:52

+0

@TheLegend我只是编辑我的文章,因为我真的需要检查我输入之前我提交。如果financial_year_2014失败,并且financial_year_2015失败,那么它会被踢进其他的建立2个新的范围,让您轻松访问2014个月和2015个月的数量 – MCBama 2014-09-19 14:43:36

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 

要知道,它的Wi将比较范围的每个成员。