在轨道中打印出日期范围

时间:2015-11-02 04:54:13

标签: ruby-on-rails ruby

我希望在明年创建一个日期范围对的顺序列表,包括数周,数月和四个星期。

因此,例如,几个星期我需要有一个日期范围2/11/2015 - 2015年11月8日,在今年余下的时间里循环。

几个月它需要生产01/11/2015 - 2015年11月30日,并在今年剩余时间内完成。

非常感谢任何帮助!!

2 个答案:

答案 0 :(得分:0)

使用ActiveSupport,Rails会向Fixnum添加方法,例如#days#weeks#months#fortnights#years

https://github.com/rails/rails/blob/ef5144d8a5529baebdaf76dbf253d1d6f2d8689b/activesupport/lib/active_support/core_ext/numeric/time.rb

https://github.com/rails/rails/blob/ef5144d8a5529baebdaf76dbf253d1d6f2d8689b/activesupport/lib/active_support/core_ext/integer/time.rb

以下示例并不完美,因为它没有考虑奇怪的日期案例(例如有53周的年份)。我相信别人会有更好的解决方案。您还可以通过在日期超过Date.today + 1.year后退出循环来改进我的解决方案。为了演示目的,我想保持简单。

(1..52).each_with_object([]) do |week_idx, memo| 
  memo << [Date.today + (week_idx - 1).weeks, Date.today + week_idx.weeks] 
end

答案 1 :(得分:0)

weeks_ary = Array.new
month_ary = Array.new
(Date.today..Date.today.next_year).each do |date|
    if date.wday == 1
        end_week = date + 6.days
        weeks_ary << "#{date.strftime('%d/%m/%Y')} - #{end_week.strftime('%d/%m/%Y')}"
    end
    if date.strftime('%d') == "01"
        month_ary << "#{date.strftime('%d/%m/%Y')} - #{date.end_of_month.strftime('%d/%m/%Y')}"
    end
end
#output:
# weeks_ary = ["02/11/2015 - 08/11/2015", "09/11/2015 - 15/11/2015", "16/11/2015 - 22/11/2015", "23/11/2015 - 29/11/2015", "30/11/2015 - 06/12/2015", "07/12/2015 - 13/12/2015", "14/12/2015 - 20/12/2015", "21/12/2015 - 27/12/2015", "28/12/2015 - 03/01/2016", "04/01/2016 - 10/01/2016", "11/01/2016 - 17/01/2016", "18/01/2016 - 24/01/2016", "25/01/2016 - 31/01/2016", "01/02/2016 - 07/02/2016", "08/02/2016 - 14/02/2016", "15/02/2016 - 21/02/2016", "22/02/2016 - 28/02/2016", "29/02/2016 - 06/03/2016", "07/03/2016 - 13/03/2016", "14/03/2016 - 20/03/2016", "21/03/2016 - 27/03/2016", "28/03/2016 - 03/04/2016", "04/04/2016 - 10/04/2016", "11/04/2016 - 17/04/2016", "18/04/2016 - 24/04/2016", "25/04/2016 - 01/05/2016", "02/05/2016 - 08/05/2016", "09/05/2016 - 15/05/2016", "16/05/2016 - 22/05/2016", "23/05/2016 - 29/05/2016", "30/05/2016 - 05/06/2016", "06/06/2016 - 12/06/2016", "13/06/2016 - 19/06/2016", "20/06/2016 - 26/06/2016", "27/06/2016 - 03/07/2016", "04/07/2016 - 10/07/2016", "11/07/2016 - 17/07/2016", "18/07/2016 - 24/07/2016", "25/07/2016 - 31/07/2016", "01/08/2016 - 07/08/2016", "08/08/2016 - 14/08/2016", "15/08/2016 - 21/08/2016", "22/08/2016 - 28/08/2016", "29/08/2016 - 04/09/2016", "05/09/2016 - 11/09/2016", "12/09/2016 - 18/09/2016", "19/09/2016 - 25/09/2016", "26/09/2016 - 02/10/2016", "03/10/2016 - 09/10/2016", "10/10/2016 - 16/10/2016", "17/10/2016 - 23/10/2016", "24/10/2016 - 30/10/2016", "31/10/2016 - 06/11/2016"]
# month_ary = ["01/12/2015 - 31/12/2015", "01/01/2016 - 31/01/2016", "01/02/2016 - 29/02/2016", "01/03/2016 - 31/03/2016", "01/04/2016 - 30/04/2016", "01/05/2016 - 31/05/2016", "01/06/2016 - 30/06/2016", "01/07/2016 - 31/07/2016", "01/08/2016 - 31/08/2016", "01/09/2016 - 30/09/2016", "01/10/2016 - 31/10/2016", "01/11/2016 - 30/11/2016"]