Rails: Можно ли получить объект Date, ближайший к понедельнику сегодня? - PullRequest
12 голосов
/ 23 декабря 2010

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

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

Дата. Завтра. Дата.там что-то вроде Date.nearest: понедельник?

Ответы [ 5 ]

20 голосов
/ 23 декабря 2010

Метод коммерческий объекта 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)

Я не могу выполнить это прямо сейчас, поэтому прости меня, если есть синтаксические ошибки.

10 голосов
/ 30 апреля 2015

Это немного сложно, но не так сложно вычислить.

Используйте ActiveSupport::DateAndTimeCalculations#end_of_week для вычисления конца недели, этот метод принимает параметр start_day, который используется для указания дня начала недели (по умолчанию :monday). Они даже реализовали sunday метод.

Хитрость в следующем: если вы хотите рассчитать ближайший понедельник, вы можете рассчитать его как конец недели, которая начинается во вторник (вт => 1-й день, ср => 2-й день, ..., пн = > 7-й день, который также является концом недели).

Так что все, что вам нужно сделать, это:

# it will return current date if today is Monday and nearest Monday otherwise
Date.today.end_of_week(:tuesday) 
5 голосов
/ 20 августа 2016

Я знаю, что это старая ветка, но всегда приятно держать ее в курсе для будущих искателей.

Предположим, сегодня пятница, 19 августа. Все, что я делаю, чтобы получить мой ближайший понедельник, это:

monday = Date.today.monday

Тогда оттуда вы можете вернуться на неделю назад или на неделю вперед, например:

last_monday = monday.last_week
next_monday = monday.next_week
5 голосов
/ 23 декабря 2010

Предполагая, что вы хотите оба направления: Date.today.beginning_of_week + 7*(Date.today.wday/5)

0 голосов
/ 23 декабря 2010

Не проверено, поэтому вам может потребоваться выполнить тонкую настройку, но здесь вы идете:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...