将日期范围转换为数周和数月的数组

时间:2014-03-27 18:14:03

标签: ruby-on-rails ruby date

我想采用给定的日期范围并将其转换为日历周和月的结束日期。

所以,相同的范围,但会有weeksmonths输出。

范围:Date.parse("2014-01-30")..Date.parse("2014-03-27")

输出:

weeks = ["2014-02-02", "2014-02-09", "2014-02-16", "2014-02-23", "2014-03-02", "2014-03-09", "2014-03-16", "2014-03-23", "2014-03-02", "2014-03-30"]
months = ["2014-01-31", "2014-02-28", "2014-03-31"]

我碰巧在Rails应用程序中执行此操作,因此可以使用Rails帮助程序方法(例如,end_of_week)。

5 个答案:

答案 0 :(得分:16)

我可以想到如下:

require 'date'

months = (Date.parse("2014-01-30")..Date.parse("2014-03-27")).group_by(&:month).map { |_,v| v.first.end_of_month.to_s } 
# => ["2014-01-31", "2014-02-28", "2014-03-31"]

weeks = (Date.parse("2014-01-30")..Date.parse("2014-03-27")).select(&:sunday?).map(&:to_s) 
# => ["2014-02-02",
#     "2014-02-09",
#     "2014-02-16",
#     "2014-02-23",
#     "2014-03-02",
#     "2014-03-09",
#     "2014-03-16",
#     "2014-03-23"]

答案 1 :(得分:1)

对于一周使用步骤。

(Date.parse("2014-01-30")..Date.parse("2014-03-27")).step(7).map(&:to_s)

月份不起作用,因为天数不同。

答案 2 :(得分:0)

使用.sunday?查看周末,end_of_month查看是否是月末。

周末:

(Date.parse("2014-01-30")..Date.parse("2014-03-27")).each { |d| puts d if d.sunday?}

月结束:

(Date.parse("2014-01-30")..Date.parse("2014-03-27")).each { |d| puts d if d == d.end_of_month}

答案 3 :(得分:0)

即使日期范围超过12个月,此答案也会考虑日期范围内的所有月份。

d1 = Date.parse("2014-01-30") 
d2 = Date.parse("2014-03-27")

使用Ruby: -

months = ((d1)..(d2)).each_with_object([]){|d, o| o << (Date.civil(d.year, d.month, -1)).to_s}.uniq

sundays = ((d1)..(d2.wday < 7 ? d2 + 7 - d2.wday : d2)).each_with_object([]){|d, o| o << d.to_s if d.sunday?}

使用Rails: -

months = ((d1)..(d2.end_of_month)).each_with_object([]){|d, o| o << d.to_s if d.sunday?}

sundays = ((d1)..(d2.end_of_month)).each_with_object([]){|d, o| o << d.end_of_month.to_s}.uniq

在获取月份结束日期的数组时,我找到每个月结束日期的逻辑效率不高。但是,我找到星期日日期的逻辑更好。

答案 4 :(得分:0)

以下是如何使用纯Ruby(没有ActiveSupport或Rails)来实现它:

weeks = (Date.parse("2014-01-30")..Date.parse("2014-03-27")).select(&:sunday?)
months = (Date.parse("2014-01-30")..Date.parse("2014-03-27")).select { |x| (x + 1).month != x.month }

使用Rails:

weeks = (Date.parse("2014-01-30")..Date.parse("2014-03-27")).select(&:sunday?)
months = (Date.parse("2014-01-30")..Date.parse("2014-03-27")).map(&:end_of_month).uniq