Class: Date

Inherits:
Object
  • Object
show all
Includes:
Holidays
Defined in:
lib/holidays.rb

Overview

Extending Ruby’s Date class with the Holidays gem

The Holidays gem automatically extends Ruby’s Date class and gives you access to three new methods: holiday?, #holidays and #calculate_mday.

Examples

Lookup Canada Day in the :ca region

Date.civil(2008,7,1).holiday?(:ca)
=> true

Lookup Canada Day in the :fr region

Date.civil(2008,7,1).holiday?(:fr)
=> false

Lookup holidays on North America in January 1.

Date.civil(2008,1,1).holidays(:ca, :mx, :us, :informal, :observed)
=> [{:name => 'New Year\'s Day'...}]

Constant Summary

Constants included from Holidays

Holidays::DAY_SYMBOLS, Holidays::MONTH_LENGTHS, Holidays::VERSION, Holidays::WEEKS

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Holidays

between, ca_victoria_day, closest_monday, de_buss_und_bettag, easter, is_sumardagurinn_fyrsti, merge_defs, next_week, on, previous_friday, se_alla_helgons_dag, se_midsommardagen, to_monday_if_sunday, to_monday_if_weekend, to_weekday_if_boxing_weekend, to_weekday_if_weekend, us_inauguration_day

Class Method Details

.calculate_mday(year, month, week, wday) ⇒ Object

Calculate day of the month based on the week number and the day of the week.

Parameters

year

Integer.

month

Integer from 1-12.

week

One of :first, :second, :third, :fourth, :fifth or :last.

wday

Day of the week as an integer from 0 (Sunday) to 6 (Saturday) or as a symbol (e.g. :monday).

Returns an integer.

Examples

First Monday of January, 2008:

Date.calculate_mday(2008, 1, :first, :monday)
=> 7

Third Thursday of December, 2008:

Date.calculate_mday(2008, 12, :third, :thursday)
=> 18

Last Monday of January, 2008:

Date.calculate_mday(2008, 1, :last, 1)
=> 28

– see www.irt.org/articles/js050/index.htm

Raises:

  • (ArgumentError)


389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
# File 'lib/holidays.rb', line 389

def self.calculate_mday(year, month, week, wday)
  raise ArgumentError, "Week parameter must be one of Holidays::WEEKS (provided #{week})." unless WEEKS.include?(week) or WEEKS.has_value?(week)

  unless wday.kind_of?(Numeric) and wday.between?(0,6) or DAY_SYMBOLS.index(wday)
    raise ArgumentError, "Wday parameter must be an integer between 0 and 6 or one of Date::DAY_SYMBOLS."
  end

  week = WEEKS[week] if week.kind_of?(Symbol)
  wday = DAY_SYMBOLS.index(wday) if wday.kind_of?(Symbol)

  # :first, :second, :third, :fourth or :fifth
  if week > 0
    return ((week - 1) * 7) + 1 + ((7 + wday - Date.civil(year, month,(week-1)*7 + 1).wday) % 7)
  end
  
  days = MONTH_LENGTHS[month-1]

  days = 29 if month == 2 and Date.leap?(year)
    
  return days - ((Date.civil(year, month, days).wday - wday + 7) % 7) - (7 * (week.abs - 1))
end

Instance Method Details

#holiday?(*options) ⇒ Boolean

Check if the current date is a holiday.

Returns true or false.

Date.civil('2008-01-01').holiday?(:ca)
=> true

Returns:

  • (Boolean)


357
358
359
360
# File 'lib/holidays.rb', line 357

def holiday?(*options)
  holidays = self.holidays(options)
  holidays && !holidays.empty?
end

#holidays(*options) ⇒ Object

Get holidays on the current date.

Returns an array of hashes or nil. See Holidays#between for options and the output format.

Date.civil('2008-01-01').holidays(:ca_)
=> [{:name => 'New Year\'s Day',...}]

Also available via Holidays#on.



347
348
349
# File 'lib/holidays.rb', line 347

def holidays(*options)
  Holidays.on(self, options)
end