Rails: есть ли возможность получить объект Date, который является самым близким понедельником до сегодняшнего дня?
С учетом даты, как найти ближайший понедельник в Rails?
Я знаю, что могу делать такие вещи, как:
Date.tomorrow
Date.today
Есть ли что-то вроде Date.nearest: monday?
Ответы
Ответ 1
Метод commercial объекта Date позволит вам сделать это. В этом примере вы получите следующий понедельник.
Date.commercial(Date.today.year, 1+Date.today.cweek, 1)
Если вам нужен следующий или предыдущий понедельник, в зависимости от того, что ближе всего, вы можете сделать:
Date.commercial(Date.today.year, Date.today.cwday.modulo(4)+Date.today.cweek, 1)
Я не могу выполнить это прямо сейчас, так что простите меня, если есть синтаксические ошибки.
Ответ 2
Это немного сложно, но не так сложно рассчитать.
Используйте ActiveSupport::DateAndTimeCalculations#end_of_week
для вычисления конца недели, этот метод принимает параметр start_day
, который используется для указания начального дня неделю (по умолчанию :monday
). Они даже внедрили метод sunday
.
Трюк заключается в следующем: если вы хотите рассчитать ближайший понедельник, вы можете рассчитать его как конец недели, который начинается во вторник (Tue = > 1-й день, Wed = > 2-й день,..., пн = > 7-й день, который также является концом недели).
Итак, все, что вам нужно сделать, это:
# it will return current date if today is Monday and nearest Monday otherwise
Date.today.end_of_week(:tuesday)
Ответ 3
Предполагая, что вы хотите оба направления: Date.today.beginning_of_week + 7*(Date.today.wday/5)
Ответ 4
Я знаю, что это старый поток, но всегда приятно держать его в курсе будущих ищущих.
Предположим, сегодня говорят, что пятница 19 августа. Все, что я делаю, чтобы получить мой следующий понедельник:
monday = Date.today.monday
Затем оттуда вы можете вернуться неделю или вперед в неделю следующим образом:
last_monday = monday.last_week
next_monday = monday.next_week
Ответ 5
Неподтвержденный, так что вам, возможно, понадобится finetune, но здесь вы идете:
def Date.nearest_monday
today = Date.today
wday = today.wday
if wday > 4 # over the half of the week
today + (7 - wday) # next monday
else
today - (1 + wday) # previous monday
end
end