Login
`
Templates, Tools and Utilities
|
||
Icetips Article
Back to article list
Search Articles
Add Comment
Printer friendly
Direct link
Par2: Federal Holiday (U.S.) Function 2001-09-24 -- Marty Mohr Usage: IF Holiday(date) ...
You need two procedures:
1) Holiday PROCEDURE( pDate LONG )
Holiday LONG,DIM(10)
CODE
SetFederalHolidays(YEAR(pDate),Holiday[])
IF
INLIST(pDate,Holiday[1],Holiday[2],Holiday[3],Holiday[4],Holiday[5],Holiday[
6],Holiday[7],Holiday[8],Holiday[9],Holiday[10])
RETURN TRUE
ELSE
RETURN FALSE
END
2) SetFederalHolidays PROCEDURE ( pYear LONG , pHoliday *LONG[]) !
Declare Procedure
DayOfWeek LONG
CODE
!New Year's Day - January 1st
pHoliday[1] = DATE(1,1,pYear)
!Martin Luther King Day - Third Monday in January
DayOfWeek = DATE(1,1,pYear) % 7
pHoliday[2] = DATE(1,21-((DayOfWeek + 5) % 7),pYear)
!President's Day - Third Monday in February
DayOfWeek = DATE(2,1,pYear) % 7
pHoliday[3] = DATE(2,21-((DayOfWeek + 5) % 7),pYear)
!Memorial Day (Observed) - Last Monday in May
DayOfWeek = (DATE(6,1,pYear)-1) % 7
pHoliday[4] = DATE(5,31-((DayOfWeek + 6) % 7),pYear)
!Independence Day - July 4th
pHoliday[5] = DATE(7,4,pYear)
!Labor Day - First Monday in September
DayOfWeek = DATE(9,1,pYear) % 7
pHoliday[6] = DATE(9,7-((DayOfWeek + 5) % 7),pYear)
!Columbus Day - Second Monday in October
DayOfWeek = DATE(10,1,pYear) % 7
pHoliday[7] = DATE(10,14-((DayOfWeek + 5) % 7),pYear)
!Veterans Day - November 11th
pHoliday[8] = DATE(11,11,pYear)
!Thanksgiving - Fourth Thursday in November
DayOfWeek = DATE(11,1,pYear) % 7
pHoliday[9] = DATE(11,28-((DayOfWeek + 2) % 7),pYear)
!Christmas - December 25th
pHoliday[10] = DATE(12,25,pYear)
Obviously you can expand it for more "holidays" than those listed.
Carl Barnes adds:
I think an Array would be a lot faster than a QUEUE, it would be much
smaller and simpler, just 40 bytes. I proved that in the ClaMag Challenge
Parse Test where my array based solution beat the next fastest by twice.
I probably would do this without any Array or Queue and a Big CASE. In many
ways the code is much simpler and faster as just the current date can be
analyzed to figure out what Nth Day-of-week it is, etc. I tested this code
and it works.
Holiday PROCEDURE(LONG pDate)
Day LONG,AUTO
Dow LONG,AUTO
DowNum LONG,AUTO
Holiday BYTE(0)
Dows ITEMIZE(0)
Sunday EQUATE
Monday EQUATE
Tuesday EQUATE
Wednesday EQUATE
Thursday EQUATE
Friday EQUATE
Saturday EQUATE
END
CODE
Day = DAY(pDate)
Dow = pDate % 7
DowNum = (Day-1) / 7 + 1 !1st,2nd,3rd DOW etc
CASE MONTH(pDate)
OF 1
IF Day=01 THEN Holiday=True. !1/1 New years Day
IF Day=20 THEN Holiday=True. !20 jan - inauguration day
IF Dow=Monday AND DowNum=3 THEN Holiday=True. !Martin Luther
King Day - Third Monday in January
OF 2
IF Dow=Monday AND DowNum=3 THEN Holiday=True. !President's Day -
Third Monday in February
OF 6
IF Day=14 THEN Holiday=True. !14 june - flag day
IF Dow=Monday AND Day+7>31 THEN Holiday=True. !Memorial Day
(Observed) - Last Monday in May
OF 7
IF Day=4 THEN Holiday=True. !7/4 July 4th
OF 9
IF Dow=Monday AND DowNum=1 THEN Holiday=True. !Labor Day - First
Monday in September
OF 10
IF Dow=Monday AND DowNum=2 THEN Holiday=True. !Columbus Day -
Second Monday in October
OF 11
IF Day=11 THEN Holiday=True. !Veterans Day -
November 11th
IF Dow=Thursday AND DowNum=4 THEN Holiday=True. !Thanksgiving -
Fourth Thursday in November
OF 12
IF Day=25 THEN Holiday=True. !Christmas -
December 25th
END
IF Holiday AND ~INRANGE(Day,Monday,Friday) THEN Holiday=2. !Return 2 if
on a Weekend
RETURN( Holiday )
Today is November 21, 2024, 3:52 am This article has been viewed 35239 times.
|
|