Как построить месячный диапазон, который учитывает количество дней каждого месяца? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть диапазон с start_date, end_date, и я хочу получить один и тот же день каждого месяца для всего диапазона, поэтому здесь, начиная с 30 января, я должен получать 30-е число каждого месяца:

start_date = Date.new(2019, 1, 30)
end_date = Date.new(2019, 12, 30)

range = (start_date...end_date)
dates = range.step(30).map(&:to_date)

dates
#=> [Wed, 30 Jan 2019,
#    Fri, 01 Mar 2019,
#    Sun, 31 Mar 2019,
#    Tue, 30 Apr 2019,
#    Thu, 30 May 2019,
#    Sat, 29 Jun 2019,
#    Mon, 29 Jul 2019,
#    Wed, 28 Aug 2019,
#    Fri, 27 Sep 2019,
#    Sun, 27 Oct 2019,
#    Tue, 26 Nov 2019,
#    Thu, 26 Dec 2019]

Я использовал что-то подобное для weeks, но с месяцами, когда вы, например, попадаете в февраль, это, конечно, дает сбой, поэтому мне пришлось бы перейти на 28-е.

Я знаюЯ мог бы зациклить и посмотреть на месяц и внести коррективы на основе start_date, но это кажется плохой идеей.

1 Ответ

4 голосов
/ 23 октября 2019

Я думаю, вы можете использовать либо активную поддержку:

require 'active_support/time'
start_date = Date.parse('2019-10-31')
12.times.map { |i| start_date + i.month }

=> [
 Thu, 31 Oct 2019,
 Sat, 30 Nov 2019,
 Tue, 31 Dec 2019,
 Fri, 31 Jan 2020,
 Sat, 29 Feb 2020,
 Tue, 31 Mar 2020,
 Thu, 30 Apr 2020,
 Sun, 31 May 2020,
 Tue, 30 Jun 2020,
 Fri, 31 Jul 2020,
 Mon, 31 Aug 2020,
 Wed, 30 Sep 2020
]

, либо настроить: #next_month:

require 'date'
Date.parse('2019-10-31').next_month # => Sat, 30 Nov 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...