[comp.lang.c] day of week

sfs@cbnewsm.att.com (salvatore.savastano) (09/22/90)

I have a function that works as follows:
        If the parameter passed is zero it returns the current 
	time in UNIX long as in time(2);
        otherwise the value passed is considered to be in the format
        YYMMDD and returns the number of days since Jan 1, 1970

using this as a basis, does anyone have a program or an
algorithm that for a parameter also specified as a date in
YYMMDD format, will return the day of the week on which that date 
orrurred?
e.g.:  
		date = "900927"
		f(date) --->> "fri" ( or some code, e.g.: 5)


sal savastano
att!somerset!pisc7c!sfs

black@beno.CSS.GOV (Mike Black) (09/23/90)

In article <1990Sep21.232813.2516@cbnewsm.att.com> sfs@cbnewsm.att.com (salvatore.savastano) writes:
>
>I have a function that works as follows:
>        If the parameter passed is zero it returns the current 
>	time in UNIX long as in time(2);
>        otherwise the value passed is considered to be in the format
>        YYMMDD and returns the number of days since Jan 1, 1970
>
>using this as a basis, does anyone have a program or an
>algorithm that for a parameter also specified as a date in
>YYMMDD format, will return the day of the week on which that date 
>orrurred?

Someone posted the algorithm earlier and I made the following code which you
should be able to easily change (i.e. prograis standalone with dotw function
built in):


/* I made the code to go with the following algorithm.  Makes for
   a simple enough routine.
   Mike Black, black@beno.CSS.GOV, Melbourne FL. 10 Sep 90
*/

/*
Here is an algorithm known as Zeller's congruence.  It may be of
general interest, so I am posting it.  I found it in a magazine (I
forget which one) a few years ago.

The day of the week (0 = Sunday) is given by
  W = ((26*M - 2) / 10 + D + Y + Y/4 + C/4 - 2*C) % 7
  where
        C is the century
        Y is the last two digits of the year
        D is the day of the month
        M is a special month number, where Jan and Feb are taken as
          month 11 and 12 of the previous year

Each division is truncating division, and the terms cannot be combined.
--

Steve Clamage, TauMetric Corp, steve@taumet.com
*/

int dotw(day,month,year,century)
int day,month,year,century;
{
    if(month==1) {
        month=11;
        year--;
    }
    else if (month==2) {
        month=12;
        year--;
    }
    else month-=2;

    return ((26*month - 2) / 10 +
            day + year + year/4 + century/4 - 2 * century ) % 7;
}

char *daystr[7] = { "Sun","Mon","Tues","Wednes","Thurs","Fri","Satur" };

main(argc,argv)
int argc;
char **argv[];
{
    int month,day,century,year,n;

    if ((n=sscanf(argv[1],"%d/%d/%2d%2d",&month,&day,&century,&year)) != 4) {
        if (n == 3 && century>=90 && century<=99) { /* allow for 1990-1999 */
            year = century;
            century = 19;
        }
        else {
            puts("Usage: dotw month/day/year, i.e. 9/10/1990");
            puts("1990-1999 can be abbreviated as 90-99");
            exit(5);
        }
    }
    n = dotw(day,month,year,century);
    printf("%d/%d/%2d%2d is a %sday\n",month,day,century,year,
            daystr[n]);
    return n;
}

--
-------------------------------------------------------------------------------
: usenet: black@beno.CSS.GOV   :  land line: 407-494-5853  : I want a computer:
: real home: Melbourne, FL     :  home line: 407-242-8619  : that does it all!:
-------------------------------------------------------------------------------

flaps@dgp.toronto.edu (Alan J Rosenthal) (09/23/90)

Given the number of days since a day which is a Thursday, the day number of the
week is simply:
	(number_of_days + 4) % 7

No need for Zeller's congruence.