2017-09-14 123 views
0

我有一組日期。我需要將它們的親密度排序到某些test_date。數組中的日期可以是之前的之後即test_date。Ruby:按日期排列日期

我的簡單的紅寶石程序沒有得到它的權利。我的策略是將每個Date轉換爲unix時間戳。然後我通過日期和test_date之間的差異的絕對值進行自定義排序。

下面是程序:

require 'date' 
test_date = DateTime.new(2017,2,3,4,5,6) 

date1 = Date.new(2017,1,6) 
date2 = Date.new(2017,1,5) 
date3 = Date.new(2017,2,5) 
date4 = Date.new(2017,2,6) 
date5 = Date.new(2017,2,9) 
date6 = Date.new(2017,2,1) 
date7 = Date.new(2017,2,2) 

dates_ary = date1, date2, date3, date4, date5, date6, date7 

sorted_dates = dates_ary.sort do |d1, d2| 
    if((d1.to_time.to_i - test_date.to_time.to_i).abs <= (d2.to_time.to_i - test_date.to_time.to_i).abs) 
     d1 <=> d2 
    else 
     d2 <=> d1 
    end 
end 

puts "expected order: " 
puts "2017-02-02" 
# pointed out in comments that 2017-02-05 will be closer than 2017-02-01 due to test_date having present hours, minutes, and seconds. 
puts "2017-02-05" 
puts "2017-02-01" 
puts "2017-02-06" 
puts "2017-02-09" 
puts "2017-01-06" 
puts "2017-01-05" 
puts '' 

puts 'actual order:' 
sorted_dates.each {|d| puts d} 

另外:如果是通過他們的親近另一個日期排序日期一些現有的紅寶石或軌道的方法,讓我知道。謝謝!

+1

你爲什麼想到'date6'來之前'date3'?你確定要比較'日期'和'日期時間'嗎? –

+0

我正在將此應用於rails項目,其中'test_date'表示'created_at'是DateTime類型,以及其他一些屬性是Date類型。 – Neil

+0

但是爲什麼'2017-02-01'會在'2017-02-05'之前?你的意思是比較'日期'和'日期時間'的日期組件? –

回答

3

if是多餘的。紅寶石將處理它:

sorted_dates = dates.sort do |d1, d2| 
    (d1.to_time.to_i - test_date.to_time.to_i).abs <=> (d2.to_time.to_i - test_date.to_time.to_i).abs 
end 
更好

sorted_dates = dates.sort_by do |date| 
    (date.to_time.to_i - test_date.to_time.to_i).abs 
end 

更好:

sorted_dates = dates.sort_by { |date| (date - test_date).abs } 
+0

但是這不會給OP的期望輸出。 –

+0

@ muistooshort我已經決定這可能是OP的錯誤 –

+0

我糾正了我的帖子,以便預期的結果是應該返回的。 – Neil