beginning_of_week extended in both Time and Date so that to return week start based on start day that is monday by default

This commit is contained in:
gregolsen 2011-11-06 21:42:03 +02:00 committed by Xavier Noria
parent 0a4035b12a
commit 3f1a4c3415
5 changed files with 76 additions and 20 deletions

View File

@ -174,19 +174,27 @@ class Date
months_since(1)
end unless method_defined?(:next_month)
# Returns a new Date/DateTime representing the "start" of this week (i.e, Monday; DateTime objects will have time set to 0:00).
def beginning_of_week
days_to_monday = self.wday!=0 ? self.wday-1 : 6
result = self - days_to_monday
# Returns number of days to start of this week, week starts on start_day (default is Monday)
def days_to_week_start(start_day = :monday)
start_day_number = DAYS_INTO_WEEK[start_day]
current_day_number = wday != 0 ? wday - 1 : 6
days_span = current_day_number - start_day_number
days_span >= 0 ? days_span : 7 + days_span
end
# Returns a new Date/DateTime representing the "start" of this week, week starts on start_day (i.e, Monday; DateTime objects will have time set to 0:00).
def beginning_of_week(start_day = :monday)
days_to_start = days_to_week_start(start_day)
result = self - days_to_start
self.acts_like?(:time) ? result.midnight : result
end
alias :monday :beginning_of_week
alias :at_beginning_of_week :beginning_of_week
# Returns a new Date/DateTime representing the end of this week (Sunday, DateTime objects will have time set to 23:59:59).
def end_of_week
days_to_sunday = self.wday!=0 ? 7-self.wday : 0
result = self + days_to_sunday.days
# Returns a new Date/DateTime representing the end of this week, week starts on start_day (Sunday, DateTime objects will have time set to 23:59:59).
def end_of_week(start_day = :monday)
days_to_end = 6 - days_to_week_start(start_day)
result = self + days_to_end.days
self.acts_like?(:time) ? result.end_of_day : result
end
alias :sunday :end_of_week

View File

@ -161,18 +161,26 @@ class Time
months_since(1)
end
# Returns a new Time representing the "start" of this week (Monday, 0:00)
def beginning_of_week
days_to_monday = wday!=0 ? wday-1 : 6
(self - days_to_monday.days).midnight
# Returns number of days to start of this week, week starts on start_day (default is Monday)
def days_to_week_start(start_day = :monday)
start_day_number = DAYS_INTO_WEEK[start_day]
current_day_number = wday != 0 ? wday - 1 : 6
days_span = current_day_number - start_day_number
days_span >= 0 ? days_span : 7 + days_span
end
# Returns a new Time representing the "start" of this week, week starts on start_day (deafult is Monday, e.g. Monday, 0:00)
def beginning_of_week(start_day = :monday)
days_to_start = days_to_week_start(start_day)
(self - days_to_start.days).midnight
end
alias :monday :beginning_of_week
alias :at_beginning_of_week :beginning_of_week
# Returns a new Time representing the end of this week, (end of Sunday)
def end_of_week
days_to_sunday = wday!=0 ? 7-wday : 0
(self + days_to_sunday.days).end_of_day
# Returns a new Time representing the end of this week, week starts on start_day (deafult is Monday, end of Sunday)
def end_of_week(start_day = :monday)
days_to_end = 6 - days_to_week_start(start_day)
(self + days_to_end.days).end_of_day
end
alias :at_end_of_week :end_of_week

View File

@ -54,6 +54,24 @@ class DateTimeExtCalculationsTest < Test::Unit::TestCase
assert_equal 86399,DateTime.civil(2005,1,1,23,59,59).seconds_since_midnight
end
def test_days_to_week_start
assert_equal 0, Time.local(2011,11,01,0,0,0).days_to_week_start(:tuesday)
assert_equal 1, Time.local(2011,11,02,0,0,0).days_to_week_start(:tuesday)
assert_equal 2, Time.local(2011,11,03,0,0,0).days_to_week_start(:tuesday)
assert_equal 3, Time.local(2011,11,04,0,0,0).days_to_week_start(:tuesday)
assert_equal 4, Time.local(2011,11,05,0,0,0).days_to_week_start(:tuesday)
assert_equal 5, Time.local(2011,11,06,0,0,0).days_to_week_start(:tuesday)
assert_equal 6, Time.local(2011,11,07,0,0,0).days_to_week_start(:tuesday)
assert_equal 3, Time.local(2011,11,03,0,0,0).days_to_week_start(:monday)
assert_equal 3, Time.local(2011,11,04,0,0,0).days_to_week_start(:tuesday)
assert_equal 3, Time.local(2011,11,05,0,0,0).days_to_week_start(:wednesday)
assert_equal 3, Time.local(2011,11,06,0,0,0).days_to_week_start(:thursday)
assert_equal 3, Time.local(2011,11,07,0,0,0).days_to_week_start(:friday)
assert_equal 3, Time.local(2011,11,8,0,0,0).days_to_week_start(:saturday)
assert_equal 3, Time.local(2011,11,9,0,0,0).days_to_week_start(:sunday)
end
def test_beginning_of_week
assert_equal DateTime.civil(2005,1,31), DateTime.civil(2005,2,4,10,10,10).beginning_of_week
assert_equal DateTime.civil(2005,11,28), DateTime.civil(2005,11,28,0,0,0).beginning_of_week #monday

View File

@ -59,8 +59,28 @@ class TimeExtCalculationsTest < ActiveSupport::TestCase
assert_equal Time.local(2005,11,28), Time.local(2005,12,02,0,0,0).beginning_of_week #friday
assert_equal Time.local(2005,11,28), Time.local(2005,12,03,0,0,0).beginning_of_week #saturday
assert_equal Time.local(2005,11,28), Time.local(2005,12,04,0,0,0).beginning_of_week #sunday
end
def test_days_to_week_start
assert_equal 0, Time.local(2011,11,01,0,0,0).days_to_week_start(:tuesday)
assert_equal 1, Time.local(2011,11,02,0,0,0).days_to_week_start(:tuesday)
assert_equal 2, Time.local(2011,11,03,0,0,0).days_to_week_start(:tuesday)
assert_equal 3, Time.local(2011,11,04,0,0,0).days_to_week_start(:tuesday)
assert_equal 4, Time.local(2011,11,05,0,0,0).days_to_week_start(:tuesday)
assert_equal 5, Time.local(2011,11,06,0,0,0).days_to_week_start(:tuesday)
assert_equal 6, Time.local(2011,11,07,0,0,0).days_to_week_start(:tuesday)
assert_equal 3, Time.local(2011,11,03,0,0,0).days_to_week_start(:monday)
assert_equal 3, Time.local(2011,11,04,0,0,0).days_to_week_start(:tuesday)
assert_equal 3, Time.local(2011,11,05,0,0,0).days_to_week_start(:wednesday)
assert_equal 3, Time.local(2011,11,06,0,0,0).days_to_week_start(:thursday)
assert_equal 3, Time.local(2011,11,07,0,0,0).days_to_week_start(:friday)
assert_equal 3, Time.local(2011,11,8,0,0,0).days_to_week_start(:saturday)
assert_equal 3, Time.local(2011,11,9,0,0,0).days_to_week_start(:sunday)
end
def test_beginning_of_day
assert_equal Time.local(2005,2,4,0,0,0), Time.local(2005,2,4,10,10,10).beginning_of_day
with_env_tz 'US/Eastern' do

View File

@ -3039,12 +3039,14 @@ Active Support defines these methods as well for Ruby 1.8.
h6. +beginning_of_week+, +end_of_week+
The methods +beginning_of_week+ and +end_of_week+ return the dates for the beginning and end of week, assuming weeks start on Monday:
The methods +beginning_of_week+ and +end_of_week+ receive a symbol with a day name in English (in lowercase, default is :monday) and return the dates for the beginning and end of week, assuming weeks start on day, passed as parameter:
<ruby>
d = Date.new(2010, 5, 8) # => Sat, 08 May 2010
d.beginning_of_week # => Mon, 03 May 2010
d.beginning_of_week(:sunday) # => Sun, 02 May 2010
d.end_of_week # => Sun, 09 May 2010
d.end_of_week(:sunday) # => Sat, 08 May 2010
</ruby>
+beginning_of_week+ is aliased to +monday+ and +at_beginning_of_week+. +end_of_week+ is aliased to +sunday+ and +at_end_of_week+.