我希望检查连续日期,如果 连续,则显示不同的日期。
我正在使用每个销售有多个日期的Garage Sales。我想循环浏览每个日期,并将任何连续日期分组以显示为一组: Ex:4月28日 - 4月30日
我还需要考虑非连续日期: Ex:4月15日,4月28日 - 30日
此外,每周日期需要被认为是非连续的(所以基本上避免步骤检查): Ex:4月16日,4月23日,4月30日
到目前为止,我已经将每个日期都没有通过&正确地订购它们。
garage_sale_dates.where("date > ?",Time.now).order(:date)
感谢您的帮助!如果需要任何其他信息,请告诉我。
答案 0 :(得分:1)
一个简单的脚本可以解决这个问题
def date_list(dates)
result = []
dates.each do |date|
if result.empty? || (date - result.last.last).to_i != 1
result << [date]
else
result.last << date
end
end
result
end
# make sure dates is an array of dates
dates = [Thu, 28 Apr 2016, Fri, 29 Apr 2016, Sun, 01 May 2016, Mon, 02 May 2016, Tue, 03 May 2016, Thu, 05 May 2016, Fri, 06 May 2016, Sat, 07 May 2016, Sun, 08 May 2016]
#this would give you an array of date ranges that you wanted
date_list(dates)
=> [
[Thu, 28 Apr 2016, Fri, 29 Apr 2016],
[Sun, 01 May 2016, Mon, 02 May 2016, Tue, 03 May 2016],
[Thu, 05 May 2016, Fri, 06 May 2016, Sat, 07 May 2016, Sun, 08 May 2016]
]
答案 1 :(得分:1)
您可以使用Enumerable
slice_before
method
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]]
然后你可以简单地用结果“ - ”加入结果中的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"]
在文档中甚至有一个注释的例子在技术上等同于你的(但处理整数,而不是日期)。
答案 2 :(得分:0)
使用Date你可以进行减法,它可以是:
date1 = 1.day.ago
date2 = 2.day.ago
(date1.to_date - date2.to_date).to_i
=> 1
答案 3 :(得分:0)
我发现使用chunk_while
method(从Ruby 2.4.6获得)更简单的解决方案。
dates = [Date.yesterday, Date.today, Date.tomorrow, Date.parse('2020-05-01'), Date.parse('2020-05-02'), Date.parse('2020-05-05')]
# => [Thu, 26 Mar 2020, Fri, 27 Mar 2020, Sat, 28 Mar 2020, Fri, 01 May 2020, Sat, 02 May 2020, Tue, 05 May 2020]
dates.chunk_while { |date_before, date_after| (date_after - date_before).to_i == 1 }.to_a
# => [[Thu, 26 Mar 2020, Fri, 27 Mar 2020, Sat, 28 Mar 2020], [Fri, 01 May 2020, Sat, 02 May 2020], [Tue, 05 May 2020]]
我认为它更具可读性,并且只需更少的步骤即可获得相同的结果。