Operating System - HP-UX
1748074 Members
5495 Online
108758 Solutions
New Discussion юеВ

Re: First work day in the month?

 
SOLVED
Go to solution
Ryan Clerk
Frequent Advisor

First work day in the month?

Hello again experts,

I have another problem. I need to know if today is the first work day of the month. For example, if the 1st was Saturday then Monday the 3rd would be the first work day. Any ideas?

Thank you,
Ryan
16 REPLIES 16
Eric Bakken
Regular Advisor

Re: First work day in the month?

In my opinion, Monday the 3rd would be the first "Workday" of the month. It really depends on the company though.
A. Clay Stephenson
Acclaimed Contributor
Solution

Re: First work day in the month?

This is actually a little bit trickier that you think because it's more than looking for the first Monday; it's really the first Monday - Friday that is also not a holiday.

I'll assume that you have been a good boy and set up /etc/acct/holidays and it's a better idea to set up multiple years by creating separate /etc/acct/holidays_YYYY because consider the problem of also crossing year boundaries and 1-Jan is a very common holiday.

I would set up a cron job that runs EVERY Monday-Friday (remember some folks have very long holidays) and then do this:

#!/usr/bin/sh

# first test to see if yesterday's month
# skipping past Sundays and Saturdays and
# holidays is not equal to today's month
if [[ $(caljd.pl -p 1 -x 0 -x 6 -h -M) != $(caljd.pl -M) ]]
then
# now check to see if today isn't also
# a holiday
if [[ $(caljd.pl) = $(caljd.pl -h) ]]
then
echo "Today is the first working day of the month."
fi
fi

Invoke as caljd.pl -u for full usage and examples. You should already have a copy of the script.
If it ain't broke, I can fix that.
Hein van den Heuvel
Honored Contributor

Re: First work day in the month?

As Clay indicates... it is probably NOT enough to answer the question only taking weekdays into consideration.

But if you did, and did not count holidays, then the rule would appear to be:
It is the first workday in the month if it is the first of the months and not a Saturday nor Sunday or if it is a Monday and the 2nd or 3rd of the month.

In Perl:

my ($mday,$wday) = (localtime(time))[3,6];
print "YES\n" if (($mday==1 && $wday && $wday != 6) || ($mday < 4 && $wday == 1 ))


And in perl with taking a YYYYMMDD as argument:

--- test.pl ---
use Time::Local;
$x=shift;
$y=timelocal(0,0,0,substr($x,6,2),substr($x,4,2)-1,substr($x,0,4)-1900);
my ($mday,$wday) = (localtime($y))[3,6];
print "YES\n" if (($mday==1 && $wday && $wday != 6) || ($mday < 4 && $wday == 1 ))
----

perl test.pl 20070101

The first mondays in a month is a relatively popular holiday day!

fwiw,
Hein

Steve Post
Trusted Contributor

Re: First work day in the month?

#!/bin/ksh
# start of SCHEDULE TEST
# 1. Have a $x1_listofdates in this program that gives a schedule.
# 2. Run the cronjob every day from 1st to 10th of the month.
# 3. Have the job exit out unless the day matches the schedule.
# note: typeset -i tells unix the value is an integer, not octal binary.
#------------------------------------------------------------------------------
typeset -i x1_day_of_month=`date +"%d"`
x1_month_of_year=`date +"%b"`
typeset -i x1_year=`date +"%Y"`

x1_datestring=`printf "%02d%s%4d\n" $x1_day_of_month $x1_month_of_year $x1_year`

# these days are when the script should run.
# they are the 2nd workday of each month.
x1_listofdates="
05Sep2007
02Oct2007
02Nov2007
04Dec2007
"
x1_FLAGRUN=0
echo "Run my special job today?"
for x1_D in $x1_listofdates
do
echo " today is $x1_datestring look at $x1_D from the list. "
if [ "$x1_D" = "$x1_datestring" ] ; then
echo "Yes. "
x1_FLAGRUN=1
else
echo "do not run today"
fi
done

if [ $x1_FLAGRUN != 1 ] ; then
echo "do not run today"
exit
fi

rest of program goes here
Steve Post
Trusted Contributor

Re: First work day in the month?

My version is simple, but it requires you to put in a list of dates for when you want the program to run.

Of course if your schedule follows NO rules, this might be a good thing.
Michael D. Zorn
Regular Advisor

Re: First work day in the month?

Here's a website, "Shell Corner: Today_is.pl and holidays.awk":

http://www.unixreview.com/documents/s=1344/ur0309c/

That one links to this one, "The American Secular Holidays Calendar":

http://www.smart.net/%7Emmontes/ushols.html#ALG

It goes into great detail about "the first workday of a month", with all the exceptions.
Ryan Clerk
Frequent Advisor

Re: First work day in the month?

Hello (again) experts,

Thanks everyone for all the help. I am having a
little trouble making the holidays work as A. Clay correctly pointed out. I am getting this error message. "File /etc/acct/holidays year 1998 does not match expected year 2007".
Any ideas?

Thank you,
Ryan
A. Clay Stephenson
Acclaimed Contributor

Re: First work day in the month?

Uh, Ryan. You will have to tell me which of those words in the error message that you do not understand. Sadly, most of them are monosyllabic. Ok, now I'll cut you a little slack. This simply means that the year field in your current /etc/acct/holidays is 1998 rather than the current year. Back when most UNIX boxes ran accounting, the holidays file was kept up to date and a common cron entry reminded you to update the file every January (or late December). Many flavors of UNIX don't even have a holidays man page anymore.
Anyway, update the file with the current holidays and the current year and you should be fixed.

One of the changes to the holidays file convention I implemented for caljd.xx, is to add a year extension Caljd.xx will always try to find holidays_YYYY before it falls back on the default file. This way, date calculations involving holidays which cross year boundaries work as expected. I always symbolically link the current year's /etc/acct/holidays_YYYY to /etc/acct/holidays so that any other UNIX software works as expected.

If it ain't broke, I can fix that.
Ryan Clerk
Frequent Advisor

Re: First work day in the month?

Hi Clay,

Thanks. I updated /etc/acct/holidays and now it works!. I deserved to be called stupid because the error message described the problem exactly.

Thank you,
Ryan

PS, It's time for points!