Module: RiCal::CoreExtensions::Time::WeekDayPredicates

Included in:
Date, DateTime, Time
Defined in:
lib/ri_cal/core_extensions/time/week_day_predicates.rb

Overview

Provide predicate and related methods for use by the RiCal gem This module is included by Time, Date, and DateTime

Instance Method Summary collapse

Instance Method Details

#nth_wday_in_month(n, which_wday, for_time = self) ⇒ Object

e.g. to obtain the 3nd Tuesday of the receivers month use

time.nth_wday_in_month(2, 2)


17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/ri_cal/core_extensions/time/week_day_predicates.rb', line 17

def nth_wday_in_month(n, which_wday, for_time = self)
  first_of_month = for_time.to_ri_cal_property_value.change(:day => 1)
  first_in_month = first_of_month.advance(:days => (which_wday - first_of_month.wday))
  first_in_month = first_in_month.advance(:days => 7) if first_in_month.month != first_of_month.month
  if n > 0
    first_in_month.advance(:days => (7*(n - 1)))
  else
    possible = first_in_month.advance(:days => 21)
    possible = possible.advance(:days => 7) while possible.month == first_in_month.month
    last_in_month = possible.advance(:days => - 7)
    (last_in_month.advance(:days => - (7*(n.abs - 1))))
  end
end

#nth_wday_in_month?(n, which_wday) ⇒ Boolean

A predicate to determine whether or not the receiver falls on a particular weekday of its month.

Parameters

n

the ordinal number being requested

which_wday

the weekday using Ruby time conventions, i.e. 0 => Sunday, 1 => Monday, …

Returns:

  • (Boolean)


36
37
38
39
# File 'lib/ri_cal/core_extensions/time/week_day_predicates.rb', line 36

def nth_wday_in_month?(n, which_wday)
  target = nth_wday_in_month(n, which_wday)
  [self.year, self.month, self.day] == [target.year, target.month, target.day]
end

#start_of_week_with_wkst(wkst) ⇒ Object

Return a DateTime which is the beginning of the first day on or before the receiver with the specified wday



43
44
45
46
47
48
# File 'lib/ri_cal/core_extensions/time/week_day_predicates.rb', line 43

def start_of_week_with_wkst(wkst)
   wkst ||= 1
   date = ::Date.civil(self.year, self.month, self.day)
   date -= 1 while date.wday != wkst
   date
end