Pan*_*ndy 4 ruby-on-rails date ruby-on-rails-3
我希望检查连续的日期并以不同的方式显示它们(如果它们是)连续的。
我正在与每次销售有多个日期的 Garage Sales 合作。然后我想循环浏览每个日期,并将任何连续的日期分组以显示为一个组:例如:4 月 28 日 - 4 月 30 日
我还需要考虑非连续日期: 例如:4 月 15 日、4 月 28 日至 30 日
此外,需要将每周日期识别为非连续的(因此基本上避免步骤检查): 例如:4 月 16 日、4 月 23 日、4 月 30 日
到目前为止,我正在接受每个未通过的日期并正确订购它们。
garage_sale_dates.where("date > ?",Time.now).order(:date)
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!如果需要任何其他信息,请告诉我。
您可以使用该slice_before方法的Enumerable
dates = [Date.yesterday, Date.today, Date.tomorrow, Date.parse('2016-05-01'), Date.parse('2016-05-02'), Date.parse('2016-05-05')]
# => [Wed, 27 Apr 2016, Thu, 28 Apr 2016, Fri, 29 Apr 2016, Sun, 01 May 2016, Mon, 02 May 2016, Thu, 05 May 2016]
prev = dates.first
dates.slice_before { |d| prev, prev2 = d, prev; prev2 + 1.day != d }.to_a
# => [[Wed, 27 Apr 2016, Thu, 28 Apr 2016, Fri, 29 Apr 2016], [Sun, 01 May 2016, Mon, 02 May 2016], [Thu, 05 May 2016]]
Run Code Online (Sandbox Code Playgroud)
然后,您可以简单地将结果中的 2 个或多个元素数组与“-”连接起来,并保持单个元素数组不变:
prev = dates.first
dates.slice_before { |d| prev, prev2 = d, prev; prev2 + 1.day != d }.
map{|d| d.size > 1 ? "#{d.first.to_s} - #{d.last.to_s}" : d.first.to_s }
# => ["2016-04-27 - 2016-04-29", "2016-05-01 - 2016-05-02", "2016-05-05"]
Run Code Online (Sandbox Code Playgroud)
文档中甚至还有一个注释示例,它在技术上与您的示例相同(但处理的是整数,而不是日期)。
| 归档时间: |
|
| 查看次数: |
901 次 |
| 最近记录: |