0

我有一个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 的方式完成呢?

4

2 回答 2

1

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

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

该值越高,该日期的未来越多。

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

# 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] 
于 2013-09-02T14:09:31.860 回答
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"]
于 2013-09-02T13:58:38.587 回答