数组中的舍入日期和项目前删除

时间:2013-09-02 13:52:52

标签: ruby-on-rails ruby arrays

我有一组DateTime个对象,如:

a = [
 [Tue, 05 Mar 2013],
 [Tue, 12 Mar 2013],
 [Tue, 19 Mar 2013],
 [Tue, 26 Mar 2013],
 [Tue, 02 Apr 2013],
 [Tue, 09 Apr 2013]
]

其中a[0]Date个对象。我需要搜索特定日期,例如:

a.index('Tue, 06 Mar 2013'.to_date)

找到它的索引并删除此项之前(以及之后的另一种情况)的所有内容。我需要按照任何日期进行搜索,例如上面的示例中,我正在Tue, 05 Mar 2013进行搜索,因此应将其四舍五入到最接近的值:Tue, 05 Mar 2013。怎么可能以Ruby方式完成?

2 个答案:

答案 0 :(得分:1)

而不是使用日期,应该更容易使用时间戳:

'Tue, 06 Mar 2013'.to_time.to_i
 => 1362528000 

价值越高,未来这个日期越多。

如果您不经常在列表中插入项目,则每次插入新项目时,都要对其进行排序。找到日期索引后,删除所有其他项目。例如:

# Your dates list converted to timestamps
> times 
 => [1362441600, 1363046400, 1363651200, 1364256000, 1364860800, 1365465600] 
# Find the timestamp equal or greater than the given date
> correct_index_val = times.find{|x| x <= 'Tue, 27 Mar 2013'.to_time.to_i}
 => 1362441600 # this is actually the position for 26 Mar
# Position of the value equal or greater than the given date
> times.index(correct_index_val)
 => 3
# cutting the array in that point
> times[idx..-1]
 => [1364256000, 1364860800, 1365465600] 

答案 1 :(得分:0)

这是方法:

  

我需要搜索特定日期。

require 'date'

a = [
 ['Tue, 05 Mar 2013'],
 ['Tue, 12 Mar 2013'],
 ['Tue, 19 Mar 2013'],
 ['Tue, 26 Mar 2013'],
 ['Tue, 02 Apr 2013'],
 ['Tue, 09 Apr 2013']
]

nwar = a.flatten.map{|d| Date.parse(d)}
# point free style is - a.flatten.map(&Date.method(:parse))
srchdt = Date.parse('Tue, 06 Mar 2013')
p nwar.index(srchdt) # => nil
srchdt = Date.parse('Tue, 26 Mar 2013')
p nwar.index(srchdt) # => 3
  

在我们拥有该项目的索引之后,我需要删除此项目之前的所有内容(另一种情况是删除之后)。

ind = nwar.index(srchdt) # => 3
nwar.shift(ind)
p nwar.map(&:to_s) # => ["2013-03-26", "2013-04-02", "2013-04-09"]