-1

I have a date range as follows

from = Date.parse('05.01.2017')
to   = Date.parse('10.03.2018')

I want to split the date range by 30 days as follows. I want to include the from and to date.

I found this reference link. But I don't find from and to date in the response. How can I do this?

Expected Output:

05.01.2017 - 03.02.2017
04.02.2017 - 05.03.2017
06.03.2017 - 04.04.2017
...
07.02.2018 - 10.03.2018
sawa
  • 165,429
  • 45
  • 277
  • 381
Galet
  • 5,853
  • 21
  • 82
  • 148

2 Answers2

1
from = Date.parse('05.01.2017')
to   = Date.parse('10.03.2018')

s = from
e = s + 29
begin
  puts "#{s.strftime('%d.%m.%Y')} - #{e.strftime('%d.%m.%Y')}"
  s = e + 1
  e =  (s + 29 < to ) ? s + 29 : to
end while (s < to)

Output:

05.01.2017 - 03.02.2017 # 30 days
04.02.2017 - 05.03.2017 # 30 days
06.03.2017 - 04.04.2017 # 30 days
05.04.2017 - 04.05.2017 # 30 days
05.05.2017 - 03.06.2017 # 30 days
04.06.2017 - 03.07.2017 # 30 days
04.07.2017 - 02.08.2017 # 30 days
03.08.2017 - 01.09.2017 # 30 days
02.09.2017 - 01.10.2017 # 30 days
02.10.2017 - 31.10.2017 # 30 days
01.11.2017 - 30.11.2017 # 30 days
01.12.2017 - 30.12.2017 # 30 days
31.12.2017 - 29.01.2018 # 30 days
30.01.2018 - 28.02.2018 # 30 days
01.03.2018 - 10.03.2018 # remaining days till to (10.03.2018)

NOTE: 01.03.2018 - 10.03.2018 is not 30 days range. but as per OP's comment I have displayed date till to

Gagan Gami
  • 10,121
  • 1
  • 29
  • 55
1
require "date"

from = Date.parse('05.01.2017')
to   = Date.parse('10.03.2018')

first = from.jd
(from..to)
.chunk{|date| (date.jd - first) / 30}
.map{|_, (first, *, last)|
  "#{first.strftime("%d.%m.%Y")} - #{last.strftime("%d.%m.%Y")}"
}

Output:

05.01.2017 - 03.02.2017
04.02.2017 - 05.03.2017
06.03.2017 - 04.04.2017
05.04.2017 - 04.05.2017
05.05.2017 - 03.06.2017
04.06.2017 - 03.07.2017
04.07.2017 - 02.08.2017
03.08.2017 - 01.09.2017
02.09.2017 - 01.10.2017
02.10.2017 - 31.10.2017
01.11.2017 - 30.11.2017
01.12.2017 - 30.12.2017
31.12.2017 - 29.01.2018
30.01.2018 - 28.02.2018
01.03.2018 - 10.03.2018
sawa
  • 165,429
  • 45
  • 277
  • 381
  • What code needs to be changed if we use following from and to instead of Data.parse. from = Time.find_zone(@time_zone).local(2018,11,01).beginning_of_day and to = Time.find_zone(@time_zone).now.yesterday – Galet Feb 20 '19 at 12:10