5

我需要一种方法来生成一个数组,其中包含过去 12 个月中每个月的月末日期。我想出了下面的解决方案。它有效,但是,可能有一种更优雅的方法来解决这个问题。有什么建议么?有没有更有效的方法来生成这个数组?任何建议将不胜感激。

require 'active_support/time'

...

def months
  last_month_end = (Date.today - 1.month).end_of_month
  months = [last_month_end]
  11.times do
    month_end = (last_month_end - 1.month).end_of_month
    months << month_end
  end
  months
end
4

4 回答 4

8

通常当你想要一系列的事情时就开始思考map。当您使用它时,为什么不概括这种方法,以便您可以在任何n月份返回:

def last_end_dates(count = 12)
  count.times.map { |i| (Date.today - (i+1).month).end_of_month }
end

>> pp last_end_dates(5)

[Sun, 30 Jun 2013,
 Fri, 31 May 2013,
 Tue, 30 Apr 2013,
 Sun, 31 Mar 2013,
 Thu, 28 Feb 2013]
于 2013-07-21T14:46:52.057 回答
4
require 'active_support/time'

def months
  (1..12).map{|i| (Date.today - i.month).end_of_month}
end
于 2013-07-21T14:46:39.233 回答
2

没有特定的方法,但这可以是一个选项:

(1..12).map { |i| (Date.today - i.month).end_of_month }

没有什么特别的,但可以完成工作。

于 2013-07-21T14:50:32.590 回答
1
require 'active_support/time'
(1..12).map do |m|
  m.months.ago.end_of_month
end

注意,如果你想要正确的月份顺序,你也应该调用 reverse

于 2013-07-21T14:53:06.217 回答