Login
`
Templates, Tools and Utilities
|
||
Add a comment to an Icetips ArticlePlease add your comments to this article.
Please note that you must provide both a name and a valid email address in order
for us to publish your comment. Comments are moderated and are not visible until they have been approved. Spam is never approved!
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, 7:15 am This article has been viewed 35240 times.
|
|