1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Add next occur and previous occurred day of week API (#26600)

This commit is contained in:
Shota Iguchi 2017-05-30 20:13:29 +09:00 committed by David Heinemeier Hansson
parent 5d9d6a4fbf
commit 3fbe657e9b
3 changed files with 42 additions and 0 deletions

View file

@ -1,3 +1,7 @@
* Add `Date#prev_occurring` and `Date#next_occurring` to return specified next/previous occurring day of week.
*Shota Iguchi*
* Add default option to class_attribute. Before:
class_attribute :settings

View file

@ -320,6 +320,22 @@ module DateAndTime
beginning_of_year..end_of_year
end
# Returns specific next occurring day of week
def next_occurring(day_of_week)
current_day_number = wday != 0 ? wday - 1 : 6
from_now = DAYS_INTO_WEEK.fetch(day_of_week) - current_day_number
from_now += 7 unless from_now > 0
since(from_now.days)
end
# Returns specific previous occurring day of week
def prev_occurring(day_of_week)
current_day_number = wday != 0 ? wday - 1 : 6
ago = current_day_number - DAYS_INTO_WEEK.fetch(day_of_week)
ago += 7 unless ago > 0
ago(ago.days)
end
private
def first_hour(date_or_time)
date_or_time.acts_like?(:time) ? date_or_time.beginning_of_day : date_or_time

View file

@ -28,6 +28,28 @@ class DateTimeExtCalculationsTest < ActiveSupport::TestCase
end
end
def test_next_occur
datetime = DateTime.new(2016, 9, 24, 0, 0) # saturday
assert_equal datetime.next_occurring(:monday), datetime.since(2.days)
assert_equal datetime.next_occurring(:tuesday), datetime.since(3.days)
assert_equal datetime.next_occurring(:wednesday), datetime.since(4.days)
assert_equal datetime.next_occurring(:thursday), datetime.since(5.days)
assert_equal datetime.next_occurring(:friday), datetime.since(6.days)
assert_equal datetime.next_occurring(:saturday), datetime.since(1.week)
assert_equal datetime.next_occurring(:sunday), datetime.since(1.day)
end
def test_prev_occur
datetime = DateTime.new(2016, 9, 24, 0, 0) # saturday
assert_equal datetime.prev_occurring(:monday), datetime.ago(5.days)
assert_equal datetime.prev_occurring(:tuesday), datetime.ago(4.days)
assert_equal datetime.prev_occurring(:wednesday), datetime.ago(3.days)
assert_equal datetime.prev_occurring(:thursday), datetime.ago(2.days)
assert_equal datetime.prev_occurring(:friday), datetime.ago(1.day)
assert_equal datetime.prev_occurring(:saturday), datetime.ago(1.week)
assert_equal datetime.prev_occurring(:sunday), datetime.ago(6.days)
end
def test_readable_inspect
datetime = DateTime.new(2005, 2, 21, 14, 30, 0)
assert_equal "Mon, 21 Feb 2005 14:30:00 +0000", datetime.readable_inspect