如何在一个范围内搜索日期对象

时间:2013-11-24 18:58:09

标签: ruby date search methods formatting

我在Ruby文件中有一个包含日期的哈希数组,我需要能够根据需要使用Ruby搜索和显示哈希值,并使用FROM和TO日期。我怎么能这样做?到目前为止,我不能将日期保留为日期格式以搜索它们。有什么建议吗?

以下是我在搜索之前尝试格式化的内容:

def reporting_display
  while true
    puts "Please enter a date range (yyyy-mm-dd) FROM and TO"
    puts "FROM:"
    get_from = gets.chomp
    if validate_date(get_from)
      @from = Date.parse(get_from)
      puts "TO:"
      get_to = gets.chomp
      if validate_date(get_to)
        @to = Date.parse(get_to)
        puts "Please wait"
        break
      else
        puts "Invalid input" #may be able to remove this and rely on if from's Invalid input
      end
    else
      puts "Invalid input"
    end
  end

  @from
  @to
end

要搜索我尝试过的数据:

def query_sales_csv
  CSV.foreach('sales_data.csv', headers: true) do |row|
    @sales_from_csv << row
  end
  @sales_from_csv
  @sales_from_csv.each do |order|
    if [@from..@to].include?(order[:date])
      puts "Date: #{order[:date]} - Units Sold: #{order[:units_sold]} - Gross Profit: $#{order[:gross_profit]} - COGS: $#{order[:cogs]} - Net Profit: $#{order[:net_profit]}"
    else
      puts "Error: Invalid Range"
    end
  end
end

1 个答案:

答案 0 :(得分:1)

假设您的哈希看起来像这样

dates = [{:name =>"jan", :val => Date.new(2013, 1, 1)}, {:name => "feb", :val => Date.new(2013, 2, 1)}, {:name => "mar", :val => Date.new(2013, 3, 1)}]

然后以下find_all将起作用

earliest = Date.new(2013, 1, 15)
latest = Date.new(2013, 3, 15)
dates.find_all{|h| h[:val] >= earliest and h[:val] <= latest}

更新:现在有代码,行

 if [@from..@to].include?(order[:date])

错了,应该是

 if (@from..@to).include?(order[:date])

了解为何使用irb来查看

[Date.new(2013, 1, 1)..Date.new(2013, 1, 2)].class # Array
[Date.new(2013, 1, 1)..Date.new(2013, 1, 2)][0].class # Range

VS

(Date.new(2013, 1, 1)..Date.new(2013, 1, 2)).class # Range

您的代码正在检查数组以查看它是否包含日期。它没有,它只包含一个元素,范围。新代码是日期范围。