diff options
author | George Claghorn <george.claghorn@gmail.com> | 2015-01-04 20:01:26 -0500 |
---|---|---|
committer | George Claghorn <george.claghorn@gmail.com> | 2015-01-06 05:42:37 -0500 |
commit | adf5fc3b3c9b5774c0ad621ac3503d236b8ddd9c (patch) | |
tree | 2003d3b2f19a2404d1b03567b6a18bfb8b967d00 /activesupport | |
parent | de4f40826e3b979735e4f3287725f1a7a3820818 (diff) | |
download | rails-adf5fc3b3c9b5774c0ad621ac3503d236b8ddd9c.tar.gz rails-adf5fc3b3c9b5774c0ad621ac3503d236b8ddd9c.tar.bz2 rails-adf5fc3b3c9b5774c0ad621ac3503d236b8ddd9c.zip |
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.
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/CHANGELOG.md | 14 | ||||
-rw-r--r-- | activesupport/lib/active_support/core_ext/date_and_time/calculations.rb | 25 | ||||
-rw-r--r-- | activesupport/test/core_ext/date_and_time_behavior.rb | 45 |
3 files changed, 84 insertions, 0 deletions
diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index aa2090b897..aec46f71ce 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,17 @@ +* Add `#on_weekend?`, `#next_weekday`, `#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. + + *George Claghorn* + * Change the default test order from `:sorted` to `:random`. *Rafael Mendonça França* 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) diff --git a/activesupport/test/core_ext/date_and_time_behavior.rb b/activesupport/test/core_ext/date_and_time_behavior.rb index b4ef5a0597..a6a21f8de4 100644 --- a/activesupport/test/core_ext/date_and_time_behavior.rb +++ b/activesupport/test/core_ext/date_and_time_behavior.rb @@ -115,6 +115,21 @@ module DateAndTimeBehavior end end + def test_next_weekday_on_wednesday + assert_equal date_time_init(2015,1,8,0,0,0), date_time_init(2015,1,7,0,0,0).next_weekday + assert_equal date_time_init(2015,1,8,15,15,10), date_time_init(2015,1,7,15,15,10).next_weekday + end + + def test_next_weekday_on_friday + assert_equal date_time_init(2015,1,5,0,0,0), date_time_init(2015,1,2,0,0,0).next_weekday + assert_equal date_time_init(2015,1,5,15,15,10), date_time_init(2015,1,2,15,15,10).next_weekday + end + + def test_next_weekday_on_saturday + assert_equal date_time_init(2015,1,5,0,0,0), date_time_init(2015,1,3,0,0,0).next_weekday + assert_equal date_time_init(2015,1,5,15,15,10), date_time_init(2015,1,3,15,15,10).next_weekday + end + def test_next_month_on_31st assert_equal date_time_init(2005,9,30,15,15,10), date_time_init(2005,8,31,15,15,10).next_month end @@ -144,6 +159,21 @@ module DateAndTimeBehavior end end + def test_prev_weekday_on_wednesday + assert_equal date_time_init(2015,1,6,0,0,0), date_time_init(2015,1,7,0,0,0).prev_weekday + assert_equal date_time_init(2015,1,6,15,15,10), date_time_init(2015,1,7,15,15,10).prev_weekday + end + + def test_prev_weekday_on_monday + assert_equal date_time_init(2015,1,2,0,0,0), date_time_init(2015,1,5,0,0,0).prev_weekday + assert_equal date_time_init(2015,1,2,15,15,10), date_time_init(2015,1,5,15,15,10).prev_weekday + end + + def test_prev_weekday_on_sunday + assert_equal date_time_init(2015,1,2,0,0,0), date_time_init(2015,1,4,0,0,0).prev_weekday + assert_equal date_time_init(2015,1,2,15,15,10), date_time_init(2015,1,4,15,15,10).prev_weekday + end + def test_prev_month_on_31st assert_equal date_time_init(2004,2,29,10,10,10), date_time_init(2004,3,31,10,10,10).prev_month end @@ -231,6 +261,21 @@ module DateAndTimeBehavior end end + def test_on_weekend_on_saturday + assert date_time_init(2015,1,3,0,0,0).on_weekend? + assert date_time_init(2015,1,3,15,15,10).on_weekend? + end + + def test_on_weekend_on_sunday + assert date_time_init(2015,1,4,0,0,0).on_weekend? + assert date_time_init(2015,1,4,15,15,10).on_weekend? + end + + def test_on_weekend_on_monday + assert_not date_time_init(2015,1,5,0,0,0).on_weekend? + assert_not date_time_init(2015,1,5,15,15,10).on_weekend? + end + def with_bw_default(bw = :monday) old_bw = Date.beginning_of_week Date.beginning_of_week = bw |