我想采用给定的日期范围并将其转换为日历周和月的结束日期。
所以,相同的范围,但会有weeks
和months
输出。
范围: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)。
答案 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