我有一组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方式完成?
答案 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"]