aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/date_and_time
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/lib/active_support/core_ext/date_and_time')
-rw-r--r--activesupport/lib/active_support/core_ext/date_and_time/calculations.rb25
1 files changed, 25 insertions, 0 deletions
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)