Ruby on rails 在给定的时间段内,使用小丑获得最小的日期列表
我使用Elasticsearch,每天有一个索引,我希望RubyonRails应用程序通过指定最小和最精确的索引列表来查询给定时间段内的文档 我找不到获取索引列表的代码。让我解释一下: 考虑使用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
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)但我不知道从哪里开始。