1

我生成了一个名为 的表DimensionDate,其中包含 2011,12,31 和 2032,1,1 之间的所有日期。

现在,我想知道每个日期这两个日期之间一个月的绝对范围。

例如 :

2012-01-01 是第 1 个月的数字

2012-02-01 是第 2 个月的数字

2013-01-01 是第 13 个月的数字

2013-02-01 是第 14 个月的数字

2014-01-01 是第 25 个月的数字

2014-02-01 是第 26 个月的数字

ETC...

我怎么能那样做?任何想法 ?谢谢你的帮助

4

2 回答 2

6

像这样的东西?

require 'date'

def months_between_dates(date_1, date_2)
  diff_in_years  = (date_1.year-date_2.year)*12
  diff_in_months = date_1.month-date_2.month
  return (diff_in_years + diff_in_months).abs
end

start_date  = Date.new(2011,12,31)
test_date   = Date.new(2013,01,01)
test_date_2 = Date.new(2014,02,01)

p months_between_dates(start_date, test_date)   # => 13
p months_between_dates(start_date, test_date_2) # => 26

编辑:

如果您知道您将始终与特定日期进行比较,那么这里的奖励是具有默认值的版本。逻辑是一样的,只是简短而不是可读:

# Call by passing one or two dates:
def delta_months(x, y=Date.new(2011,12,31))
  ((x.year-y.year)*12+(x.month-y.month)).abs 
end

p delta_months(test_date)  # => 13

编辑2:

正如 dax 指出的那样,我的函数不提供任何形式的验证,以下是您将如何实现它:

MIN_DATE, MAX_DATE = Date.new(2011,12,31), Date.new(2032,1,1)
date_range = MIN_DATE..MAX_DATE
test_date  = Date.new(2064,1,1)

raise "Date out of range, must be between #{MIN_DATE} and #{MAX_DATE}." unless date_range.cover? test_date # => Date out of range, must be between 2011-12-31 and 2032-01-01. (RuntimeError)
delta_months(test_date)  # Never called unless good date is provided.
于 2013-10-14T11:54:15.760 回答
1

Hirolau的回答很好,但我认为这可以变得更简单/防错。由于开始时间是绝对的,因此您不需要将其包含在方法的参数中。您也可以根据结束时间对其进行测试:

def dimensional_date_range(now)
  range = (now.year - 2012)*12 + (now.month)
  if range <= 240 
    range
  else
    "you're out of this dimension, man!"
  end
end

测试:

$ date =  Date.new(2014,02,01)
$ date2 = Date.new(2050,01,01)
$ dimensional_date_range(date)
 => 26
$ dimensional_date_range(date2)
 => "you're out of this dimension, man!"
于 2013-10-14T12:28:54.140 回答