Rails,在日期范围内计算月份,在日期范围之间

时间:2014-09-19 14:13:51

标签: ruby-on-rails ruby date range

到目前为止,这是一个非常重要的任务。我想要做的是找出两个日期范围之间的日期范围有多少个月......我知道我现在听起来像是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_dateend_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个月落在范围内也不会通过。任何人都知道如何完成此操作,或者是否有任何宝石更好地处理这样的日期和范围。

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