Подтвердить что ты не робот

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

С учетом даты, как найти ближайший понедельник в Rails?

Я знаю, что могу делать такие вещи, как:

Date.tomorrow Date.today

Есть ли что-то вроде Date.nearest: monday?

4b9b3361

Ответ 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