The year 2006 approaches, with a new set of statutory holidays.
The idea of having to annually dig up the list of holidays for next year, and encode them statically into a file filled me with disgust. So I saved myself 5 minutes of work by spending 30 minutes piecing together some remind rules for calculating Canadian Statutory holidays.
These rules are derived (copied, mostly) from the examples/defs.rem distributed with remind.
Some common rules
SET Sunday 0 SET Monday 1 SET Tuesday 2 SET Wednesday 3 SET Thursday 4 SET Friday 5 SET Saturday 6 SET Sun 0 SET Mon 1 SET Tue 2 SET Wed 3 SET Thu 4 SET Fri 5 SET Sat 6 SET Jan 1 SET Feb 2 SET Mar 3 SET Apr 4 SET May 5 SET Jun 6 SET Jul 7 SET Aug 8 SET Sep 9 SET Oct 10 SET Nov 11 SET Dec 12 SET January 1 SET February 2 SET March 3 SET April 4 SET May 5 SET June 6 SET July 7 SET August 8 SET September 9 SET October 10 SET November 11 SET December 12 SET Week_1 1 SET Week_2 8 SET Week_3 15 SET Week_4 22 FSET _last(mo) "1 " + MON((mo%12)+1)+" --7" FSET _trig() TRIGGER(TRIGDATE()) FSET _trig2(days) TRIGGER(TRIGDATE()+days) FSET _back(days) TRIGGER(TODAY()-days)
The Holidays
# Federal Holidays
# http://www.pch.gc.ca/progs/cpsc-ccsp/jfa-ha/index_e.cfm
SET easter EASTERDATE(YEAR(TODAY()))
REM [TRIGGER(easter-46)] MSG Ash Wednesday
REM [TRIGGER(easter-7)] MSG Palm Sunday
OMIT [TRIGGER(easter-2)] MSG Good Friday
OMIT [TRIGGER(easter)] MSG Easter Sunday
OMIT [TRIGGER(easter+1)] MSG Easter Monday
REM [TRIGGER(easter+39)] MSG Ascension Day
REM [TRIGGER(easter+49)] MSG Pentecost
OMIT Jan 1 MSG New Year's Day
REM Feb 15 MSG National Flag of Canada Day
REM Mar 17 MSG St. Patrick's Day
REM Mon May 18 SCANFROM [_back(7)] SATISFY 1
OMIT [_trig()] MSG Victoria Day
# Victoria Day is the Monday Preceeding May 25
REM Jul 1 SCANFROM [_back(7)] SATISFY 1
IF WKDAYNUM(TRIGDATE()) == Sun
OMIT [_trig2(+1)] MSG Canada day
ELSE
OMIT [_trig()] MSG Canada day
ENDIF
# Jul 2 is Canada DAY when Jul 1 is a Sunday
REM Mon Sep [Week_1] SCANFROM [_back(7)] SATISFY 1
OMIT [_trig()] MSG Labor Day
REM Nov 11 MSG Remembrance Day
REM Mon Oct [Week_2] SCANFROM [_back(7)] SATISFY 1
OMIT [_trig()] MSG Thanksgiving Day
OMIT Dec 25 MSG Christmas Day
OMIT Dec 26 MSG Boxing Day
# Provincial Holidays
# http://www.pch.gc.ca/progs/cpsc-ccsp/jfa-ha/prov_e.cfm
REM Mon Feb [Week_3] MSG Family Day (Alberta)
#REM Jun 24 MSG National Day (Quebec)
REM Mon Aug [Week_1] MSG BC Day
REM Mon Aug [Week_1] MSG New Brunswick Day
REM Mon Aug [Week_1] MSG Heritage Day (Alberta)
REM Mon Aug [Week_1] MSG Civic Holida (Manitoba,Saskatchewan,Ontario)
# Misc
REM Feb 2 MSG Ground Hog Day
REM Feb 14 MSG Valentine's Day
REM Apr 1 MSG April Fool's Day
REM Sun May [Week_2] MSG Mother's Day
REM Sun Jun [Week_3] MSG Father's Day
REM Oct 31 MSG Halloween
# Daylight Savings time.
REM Sun Apr 1 MSG Daylight Savings Time starts (loose an hour)
REM Sun [_last(Oct)] MSG Daylight Savings Time over (gain an hour)