Ruby on rails 在rails中查找两个日期之间的月份

Ruby on rails 在rails中查找两个日期之间的月份,ruby-on-rails,ruby,ruby-on-rails-4,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 4,Ruby On Rails 5,我当前可以设置如下时间范围: start_date: "2018-09-11" end_date: "2018-11-19" 从月初到月底,我如何才能做到这一点?示例: time_range = ["2018-09-11".."2018-09-30"] time_range = ["2018-10-01".."2018-10-31"] time_range = ["2018-11-01".."2018-11-19"] 我不确定您想要的结果到底是什么,但是,给定开始日期和结束日期作为date对

我当前可以设置如下时间范围:

start_date: "2018-09-11"
end_date: "2018-11-19"
从月初到月底,我如何才能做到这一点?示例:

time_range = ["2018-09-11".."2018-09-30"]
time_range = ["2018-10-01".."2018-10-31"]
time_range = ["2018-11-01".."2018-11-19"]

我不确定您想要的结果到底是什么,但是,给定开始日期和结束日期作为
date
对象,您可以执行

(start_date..end_date).to_a.group_by(&:month).values

最后你得到的是一个三元素数组,每个元素都包含一个数组,其中包含一个月内该范围内的所有日期,以及OP提供的信息,据我所知,这是他在寻找的。 给定一个设定范围,例如:

 time_range = "2018-09-11".."2018-09-19"

 new_range_min = time_range.min.to_date.beginning_of_month
 new_range_max = time_range.max.to_date.end_of_month
 new_range = new_range_min..new_range_max

我不知道我是否很明白你的要求,但我会尽力帮助你

Date类有几个方法可以帮助您处理日期。 日期<对象

示例

my_date_range_array = [Date.today.beginning_of_year..Date.today.end_of_year]

my_date_time_range_array = [Time.now.beginning_of_year..Time.now.end_of_year]

my_date_range_array = [6.months.ago..Date.today]


YourModel.where date: Date.today.beginning_of_month..Date.today

YourModel.where date: 6.months.ago..Date.today
如果您需要该范围内的每个日期,可以使用以下内容:

(Date.today.beginning_of_year..Date.today.end_of_year).map{ |date| date }

我希望我的回答能帮助您

这是一个纯粹的Ruby解决方案,但我相信(尽管我不懂Rails),通过分别用Rails方法
每月第一天
每月第一天
替换我的方法可以稍微简化它。我设计这种方法是为了效率而不是简单

require 'date'

DATE_FMT = "%Y-%m-%d"

def date_ranges(start_date_str, end_date_str)
  start_date = Date.strptime(start_date_str, DATE_FMT)
  end_date   = Date.strptime(end_date_str, DATE_FMT)
  return [start_date_str..end_date_str] if
    [start_date.year, start_date.month] == [end_date.year, end_date.month]
  d = start_date
  ranges = [start_date_str..last_day_of_month(d)]
  loop do
    d = d >> 1
    break if [d.year, d.month] == [end_date.year, end_date.month]
    ranges << (first_day_of_month(d)..last_day_of_month(d))
  end
  ranges << (first_day_of_month(d)..end_date_str)
end

def first_day_of_month(d)
  (d - d.day + 1).strftime(DATE_FMT)
end

def last_day_of_month(d)
  ((d >> 1)-d.day).strftime(DATE_FMT)
end

在Ruby中,字符串(甚至那些表示日期的字符串)没有方法
month
。Rails的情况不同吗?如果“是”,是否会生成一个数组,其元素(每个元素对应一个月)是日期数组?如果是这样的话,你难道没有进一步的步骤来将这些日期数组转换成一个范围吗(即使你获得了绿卡)?@CarySwoveland我从两个日期对象开始,这是纯粹的rubyup投票,这是Ruby最相关的回答,你的意思是,不,不是。接收者被设计成一个日期对象,感谢您指出问题所在。更新答案。
date_ranges("2018-09-11", "2019-02-11")
  #=> ["2018-09-11".."2018-09-30", "2018-10-01".."2018-10-31",
  #    "2018-11-01".."2018-11-30", "2018-12-01".."2018-12-31",
  #    "2019-01-01".."2019-01-31", "2019-02-01".."2019-02-11"]

date_ranges("2018-09-08", "2018-09-23")
  #=> ["2018-09-08".."2018-09-23"]