Ruby code to get the date of next Monday (or any day of the week)

RubyDate

Ruby Problem Overview


Given an input of, for example,

day = 'Monday'

how can I calculate the date of the next day?

def date_of_next(day)
  ...
end

Ruby Solutions


Solution 1 - Ruby

require 'date'

def date_of_next(day)
  date  = Date.parse(day)
  delta = date > Date.today ? 0 : 7
  date + delta
end

Date.today
#=>#<Date: 2011-10-28 (4911725/2,0,2299161)>
date_of_next "Monday"
#=>#<Date: 2011-10-31 (4911731/2,0,2299161)>
date_of_next "Sunday"
#=>#<Date: 2011-10-30 (4911729/2,0,2299161)>

Solution 2 - Ruby

For anyone like me who came here looking for a solution in Rails to this problem, as of Rails 5.2 there is a much easier method to do this.

For anyone (like the original poster) not specifically using Rails, this functionality is available in the ActiveSupport gem.

To find the next occurring day of a week, we can simply write something like Date.today.next_occurring(:friday).

See the documentation for more details.

Solution 3 - Ruby

I know this is an old post, but I came up with a couple of methods to quickly get the previous and next day of the week.

# date is a Date object and day_of_week is 0 to 6 for Sunday to Saturday

require 'Date'

def get_next_day(date, day_of_week)
  date + ((day_of_week - date.wday) % 7)
end

def get_previous_day(date, day_of_week)
  date - ((date.wday - day_of_week) % 7)
end

puts today = Date.today
# 2015-02-24

puts next_friday = get_next_day(today, 5)
# 2015-02-27

puts last_friday = get_previous_day(today, 5)
# 2015-02-20

Solution 4 - Ruby

Solution 5 - Ruby

For stuff like this I rely on the chronic library.

The Ruby code would be:

def date_of_next(day)
    Chronic.parse("next #{day}")
end

Solution 6 - Ruby

If you are using rails you can use Date.today.sunday for Sunday or Date.today.monday for Monday. And then Date.today.sunday - 1.day for Saturday etc.

Solution 7 - Ruby

A Rails 4-compatible solution:

(Date.today + 1.week).beginning_of_week(:monday)

where you can provide the day you'd like to find as a symbol argument; the default is :monday.

Note that this will find the next occurrence of the given day - if today is Monday and you're looking for the next Monday, it will return the Monday one week from today.

Some equivalent ways to do it:

1.week.from_now.beginning_of_week(:monday).to_date

1.week.since(Date.today).beginning_of_week(:monday)

(source: https://apidock.com/rails/Date/beginning_of_week/class)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPanagiotis PanagiView Question on Stackoverflow
Solution 1 - Rubyfl00rView Answer on Stackoverflow
Solution 2 - Rubys_dolanView Answer on Stackoverflow
Solution 3 - RubyDevin BrownView Answer on Stackoverflow
Solution 4 - RubypanteoView Answer on Stackoverflow
Solution 5 - RubyDave NewtonView Answer on Stackoverflow
Solution 6 - RubyHannuView Answer on Stackoverflow
Solution 7 - RubyMilo PView Answer on Stackoverflow