Reputation: 10087
Given an input of, for example,
day = 'Monday'
how can I calculate the date of the next day
?
def date_of_next(day)
...
end
Upvotes: 57
Views: 31970
Reputation: 5434
I know this is a Ruby question, but I think many people using Rails are gonna find this. Many answers use Date.today
, which is server time and is usually not a good idea to use if you're on Rails. Recommended to incorporate user's time zone:
DateTime.now.in_time_zone(my_user.time_zone).next_occurring(:monday)
Upvotes: 0
Reputation: 730
Rails >= 5.2.3
Date.current.next_occurring(:monday)
https://api.rubyonrails.org/classes/DateAndTime/Calculations.html#method-i-next_occurring
Upvotes: 18
Reputation: 1462
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)
Upvotes: 5
Reputation: 1276
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.
Upvotes: 55
Reputation: 151
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.
Upvotes: 14
Reputation: 1131
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
Upvotes: 24
Reputation: 160321
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
Upvotes: 14
Reputation: 83680
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)>
Upvotes: 106