From adf5fc3b3c9b5774c0ad621ac3503d236b8ddd9c Mon Sep 17 00:00:00 2001 From: George Claghorn Date: Sun, 4 Jan 2015 20:01:26 -0500 Subject: Add #on_weekend?, #next_weekday, and #prev_weekday methods to Date, Time, and DateTime `#on_weekend?` returns true if the receiving date/time falls on a Saturday or Sunday. `#next_weekday` returns a new date/time representing the next day that does not fall on a Saturday or Sunday. `#prev_weekday` returns a new date/time representing the previous day that does not fall on a Saturday or Sunday. --- .../core_ext/date_and_time/calculations.rb | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'activesupport/lib') diff --git a/activesupport/lib/active_support/core_ext/date_and_time/calculations.rb b/activesupport/lib/active_support/core_ext/date_and_time/calculations.rb index b85e49aca5..4e86b270f9 100644 --- a/activesupport/lib/active_support/core_ext/date_and_time/calculations.rb +++ b/activesupport/lib/active_support/core_ext/date_and_time/calculations.rb @@ -9,6 +9,7 @@ module DateAndTime :saturday => 5, :sunday => 6 } + WEEKEND_DAYS = [ 6, 0 ] # Returns a new date/time representing yesterday. def yesterday @@ -35,6 +36,11 @@ module DateAndTime self > self.class.current end + # Returns true if the date/time falls on a Saturday or Sunday. + def on_weekend? + wday.in?(WEEKEND_DAYS) + end + # Returns a new date/time the specified number of days ago. def days_ago(days) advance(:days => -days) @@ -116,6 +122,15 @@ module DateAndTime first_hour(weeks_since(1).beginning_of_week.days_since(days_span(given_day_in_next_week))) end + # Returns a new date/time representing the next weekday. + def next_weekday + if tomorrow.on_weekend? + next_week(:monday).change(hour: hour, min: min, sec: sec, usec: try(:usec)) + else + tomorrow + end + end + # Short-hand for months_since(1). def next_month months_since(1) @@ -140,6 +155,16 @@ module DateAndTime end alias_method :last_week, :prev_week + # Returns a new date/time representing the previous weekday. + def prev_weekday + if yesterday.on_weekend? + beginning_of_week(:friday).change(hour: hour, min: min, sec: sec, usec: try(:usec)) + else + yesterday + end + end + alias_method :last_weekday, :prev_weekday + # Short-hand for months_ago(1). def prev_month months_ago(1) -- cgit v1.2.3