Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在给定的时间段内,使用小丑获得最小的日期列表_Ruby On Rails_Date - Fatal编程技术网

Ruby on rails 在给定的时间段内,使用小丑获得最小的日期列表

Ruby on rails 在给定的时间段内,使用小丑获得最小的日期列表,ruby-on-rails,date,Ruby On Rails,Date,我使用Elasticsearch,每天有一个索引,我希望RubyonRails应用程序通过指定最小和最精确的索引列表来查询给定时间段内的文档 我找不到获取索引列表的代码。让我解释一下: 考虑使用YYYY-MM-DD格式的日期。 您可以在日期字符串的末尾使用joker*。例如,2016-07-2*描述了从2016-07-20到2016-07-29的所有日期 现在,考虑一个由开始日期和结束日期表示的周期。 代码必须返回表示期间的最小日期数组 让我们举个例子。以下期间: 开始日期:2014-11-2

我使用Elasticsearch,每天有一个索引,我希望RubyonRails应用程序通过指定最小和最精确的索引列表来查询给定时间段内的文档

我找不到获取索引列表的代码。让我解释一下:

考虑使用
YYYY-MM-DD
格式的日期。 您可以在日期字符串的末尾使用joker
*
。例如,
2016-07-2*
描述了从
2016-07-20
2016-07-29
的所有日期

现在,考虑一个由开始日期和结束日期表示的周期。 代码必须返回表示期间的最小日期数组

让我们举个例子。以下期间:

  • 开始日期:
    2014-11-29
  • 截止日期:
    2016-10-13
代码必须返回包含以下字符串的数组:

  • 2014-11-29
  • 2014-11-30
  • 2014-12-*
  • 2015-*
  • 2016-0*
  • 2016-10-0*
  • 2016-10-10
  • 2016-10-11
  • 2016-10-12
  • 2016-10-13
如果:

  • 该代码返回最精确的日期列表(即,不返回包含描述从开始日期之前开始或在结束日期之后结束的时段的笑话的日期)
  • 代码返回的列表可能最小(即
    [“2016-09-*”]
    优于
    [“2016-09-0*”、“2016-09-1*”、“2016-09-2*”、“2016-09-30”]

有什么想法吗?

好的,经过更多思考和同事的帮助,我可能会有一个解决方案。可能没有完全优化,但仍然

def get_indices_from_period(start_date_str, end_date_str)
  dates = {}
  dates_strings = []
  start_date = Date.parse(start_date_str)
  end_date = Date.parse(end_date_str)

  # Create a hash with, for each year and each month of the period: {:YYYY => {:MMMM => [DD1, DD2, DD3...]}}
  (start_date..end_date).collect do |date|
    year, month, day = date.year, date.month, date.day
    dates[year] ||= {}
    dates[year][month] ||= []
    dates[year][month] << day
  end

  dates.each do |year, days_in_year|
    start_of_year = Date.new(year, 1, 1)
    max_number_of_days_in_year = (start_of_year.end_of_year - start_of_year).to_i + 1
    number_of_days_in_year = days_in_year.collect{|month, days_in_month| days_in_month}.flatten.size

    if max_number_of_days_in_year == number_of_days_in_year
      # Return index formatted as YYYY-* if full year
      dates_strings << "#{year}-*"

    else
      days_in_year.each do |month, days_in_month|
        formatted_month = format('%02d', month)
        if Time.days_in_month(month, year) == days_in_month.size
          # Return index formatted as YYYY-MM-* if full month
          dates_strings << "#{year}-#{formatted_month}-*"

        else
          decades_in_month = {}
          days_in_month.each do |day|
            decade = day / 10
            decades_in_month[decade] ||= []
            decades_in_month[decade] << day
          end

          decades_in_month.each do |decade, days_in_decade|
            if (decade == 0 && days_in_decade.size == 9) ||
              ((decade == 1 || decade == 2) && days_in_decade.size == 10)
              # Return index formatted as YYYY-MM-D* if full decade
              dates_strings << "#{year}-#{formatted_month}-#{decade}*"

            else
              # Return index formatted as YYYY-MM-DD
              dates_strings += days_in_decade.collect{|day| "#{year}-#{formatted_month}-#{format('%02d', day)}"}
            end
          end
        end
      end
    end
  end

  return dates_strings
end
def get_index_from_period(开始日期、结束日期)
日期={}
日期\u字符串=[]
开始日期=date.parse(开始日期)
end\u date=date.parse(end\u date\u str)
#为期间的每年和每月创建一个哈希:{:yyy=>{:MMMM=>[DD1,DD2,DD3…]}
(开始日期..结束日期).收款日期|
年、月、日=date.year、date.month、date.day
日期[年份]| |={}
日期[年][月]| |=[]

日期【年】【月】好的,经过更多思考和同事的帮助,我可能会有一个解决方案。可能没有完全优化,但仍然

def get_indices_from_period(start_date_str, end_date_str)
  dates = {}
  dates_strings = []
  start_date = Date.parse(start_date_str)
  end_date = Date.parse(end_date_str)

  # Create a hash with, for each year and each month of the period: {:YYYY => {:MMMM => [DD1, DD2, DD3...]}}
  (start_date..end_date).collect do |date|
    year, month, day = date.year, date.month, date.day
    dates[year] ||= {}
    dates[year][month] ||= []
    dates[year][month] << day
  end

  dates.each do |year, days_in_year|
    start_of_year = Date.new(year, 1, 1)
    max_number_of_days_in_year = (start_of_year.end_of_year - start_of_year).to_i + 1
    number_of_days_in_year = days_in_year.collect{|month, days_in_month| days_in_month}.flatten.size

    if max_number_of_days_in_year == number_of_days_in_year
      # Return index formatted as YYYY-* if full year
      dates_strings << "#{year}-*"

    else
      days_in_year.each do |month, days_in_month|
        formatted_month = format('%02d', month)
        if Time.days_in_month(month, year) == days_in_month.size
          # Return index formatted as YYYY-MM-* if full month
          dates_strings << "#{year}-#{formatted_month}-*"

        else
          decades_in_month = {}
          days_in_month.each do |day|
            decade = day / 10
            decades_in_month[decade] ||= []
            decades_in_month[decade] << day
          end

          decades_in_month.each do |decade, days_in_decade|
            if (decade == 0 && days_in_decade.size == 9) ||
              ((decade == 1 || decade == 2) && days_in_decade.size == 10)
              # Return index formatted as YYYY-MM-D* if full decade
              dates_strings << "#{year}-#{formatted_month}-#{decade}*"

            else
              # Return index formatted as YYYY-MM-DD
              dates_strings += days_in_decade.collect{|day| "#{year}-#{formatted_month}-#{format('%02d', day)}"}
            end
          end
        end
      end
    end
  end

  return dates_strings
end
def get_index_from_period(开始日期、结束日期)
日期={}
日期\u字符串=[]
开始日期=date.parse(开始日期)
end\u date=date.parse(end\u date\u str)
#为期间的每年和每月创建一个哈希:{:yyy=>{:MMMM=>[DD1,DD2,DD3…]}
(开始日期..结束日期).收款日期|
年、月、日=date.year、date.month、date.day
日期[年份]| |={}
日期[年][月]| |=[]

日期[年][月]你开始实施了吗?分享你的代码并寻求帮助是一个更好的主意,而不是写一个问题并寻求解决方案……不是真的,我在开始时就被卡住了。幸运的是Rails拥有处理日期所需的所有方法(例如Date.parse、.start_of_month、+1)但是我不知道从哪里开始。你开始实现了吗?最好是分享你的代码并寻求帮助,而不是写一个问题并寻求解决方案……不太好,我一开始就被卡住了。幸运的是Rails拥有处理日期所需的所有方法(例如Date.parse、.start\u of\u month、+1)但我不知道从哪里开始。