Нахождение месяцев между двумя датами в рельсах - PullRequest
0 голосов
/ 17 ноября 2018

В настоящее время я могу установить временной диапазон следующим образом:

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"]

Ответы [ 4 ]

0 голосов
/ 17 ноября 2018

Это чисто Ruby-решение, но я считаю (хотя я не знаю Rails) его можно немного упростить, заменив мои методы first_day_of_month и first_day_of_month на методы 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"]
0 голосов
/ 17 ноября 2018

С информацией, предоставленной ФП, это то, что, как я понимаю, он ищет.Для заданного диапазона, например:

 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
0 голосов
/ 17 ноября 2018

Я не знаю, хорошо ли я понимаю, что вы спросили, но я постараюсь вам помочь.

В классе Date есть несколько методов, которые помогут вам работать с датами. Дата <Объект </a>

Примеры

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 }

Я надеюсь, что мой ответ поможет вам

0 голосов
/ 17 ноября 2018

Я не уверен, каков именно ваш желаемый результат, но, учитывая дату начала и дату окончания как Date объекты, вы можете выполнить

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

и в конце вы получаете массив из трех элементов, и каждый элемент содержит массив со всеми датами в этом диапазоне за месяц

...