将时间段分成多个时间段

时间:2019-02-20 10:51:46

标签: ruby date

我的日期范围如下

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

我想按以下方式将日期范围划分为30天。我想包括“从”和“至今”。

我找到了这个参考文献link。但是我没有找到迄今为止的答复。我该怎么办?

预期输出:

05.01.2017 - 03.02.2017
04.02.2017 - 05.03.2017
06.03.2017 - 04.04.2017
...
07.02.2018 - 10.03.2018

2 个答案:

答案 0 :(得分: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)

输出:

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)

注意01.03.2018 - 10.03.2018不是30天范围。但根据OP的评论,我显示的日期一直到to

答案 1 :(得分: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")}"
}

输出:

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