查找 rails 中两个日期之间的月份
Finding the months between two dates in rails
我目前可以这样设置时间范围:
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
不知道你问的我是否明白,但我会尽力帮助你。
日期 class 有多种方法可以帮助您处理日期。
Date < Object
例子
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)它可以通过替换我的方法 first_day_of_month
和 [=12] 来稍微简化=] 分别使用 Rails 方法 beginning_of_month
和 end_of_month
。我设计的方法是为了效率而不是简单。
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
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"]
我目前可以这样设置时间范围:
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
不知道你问的我是否明白,但我会尽力帮助你。
日期 class 有多种方法可以帮助您处理日期。 Date < Object
例子
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)它可以通过替换我的方法 first_day_of_month
和 [=12] 来稍微简化=] 分别使用 Rails 方法 beginning_of_month
和 end_of_month
。我设计的方法是为了效率而不是简单。
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
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"]