[comp.lang.c] Date to Day-of-Week Conversion

markt@tse.uucp (Mark Turner) (06/20/91)

Hi folks! Can anyone help me with suggestions on how to convert a date to a
day of the week? For example, I start with a date like '19910619'; I'd like some
function to return 'Wed' or '4' or some such indication of the day. This must
be doable! 

One caveat: I'd rather not use a shell script (for instance, I could do this 
using cal and awk) - C would be best.

Please don't suggest that I should reset the system date and then pass a "tm" 
structure to the one of the ctime-related functions. I'd like to keep the 
machine up and running throughout the entire calculation!! :-)

Please mail and I'll post summaries if there is any interest (and the answer
*isn't* too embarassingly obvious).

--------------------------------------------------------------------------------
Mark Turner (markt@tse.UUCP), The Toronto Stock Exchange    

darcy@druid.uucp (D'Arcy J.M. Cain) (06/20/91)

In article <1991Jun19.170753.593@tse.uucp> Mark Turner writes:
>Hi folks! Can anyone help me with suggestions on how to convert a date to a
>day of the week? ...
>Please don't suggest that I should reset the system date and then pass a "tm" 
>structure to the one of the ctime-related functions. I'd like to keep the 

No need to muck with the system date.  Just create a tm structure and fill
it in with the known values.  now call mktime(3) and you should have the
day of the week in the tm_wday field.  If you don't have mktime then send
me mail and I will send you a version.  It's a flawed version but the flaw
is well defined and can be worked around.  It calls localtime which is not
strictly allowed under ANSI.   BTW, anyone know where I can get a PD or
freeware localtime so I can fix and post my mktime?

-- 
D'Arcy J.M. Cain (darcy@druid)     |
D'Arcy Cain Consulting             |   There's no government
Toronto, Ontario, Canada           |   like no government!
+1 416 424 2871                    |

tr@samadams.princeton.edu (Tom Reingold) (06/22/91)

This will work for this century.  I'll leave fixing it for any century
as an exercise for the reader.

#include <stdio.h>
#include <sys/types.h>
#include <time.h>

static int monlens[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
static char *daytab[] = { "Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri" };
static int keys[12];

void initkeys();

main(argc, argv)
int argc;
char *argv[];
{
    int day;
    time_t t;
    struct tm *tp;

    if (argc != 3 && argc != 4) {
yuck:
	fprintf(stderr, "usage: %s month date [year]\n", argv[0]);
	exit(1);
    }
    t = time(&t);
    tp = localtime(&t);
    tp->tm_mon = atoi(argv[1]) - 1;
    tp->tm_mday = atoi(argv[2]);
    if (argc == 4)
	tp->tm_year = atoi(argv[3]);
    initkeys(tp->tm_year);
    if (tp->tm_mon == -1 || tp->tm_mday == 0 || tp->tm_year == 0)
	goto yuck;
    if (tp->tm_mday > monlens[tp->tm_mon]) {
	fprintf(stderr, "%s: invalid date\n", argv[0]);
	exit(2);
    }
    day = dateof(tp);
    printf("%02d/%02d/%02d is a %s\n", tp->tm_mon + 1, tp->tm_mday,
	tp->tm_year, daytab[day]);
    exit(0);
}

dateof(tp) /* return day of week: Saturday=0, ..., Friday=6 */
struct tm *tp;
{
    int crap;

    crap = tp->tm_year + tp->tm_mday + keys[tp->tm_mon] +
     ((int) tp->tm_year / 4);
    return(crap % 7);
}

isleap(year)
int year;
{
    if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
	return(1);
    return(0);
}

void initkeys(n)
int n;
{
    int i;

    /* This generates a table.  I could hard code it, but I wanted
    to show what the table means. */
    if (isleap(n))
	keys[0] = 0, monlens[1] = 29;
    else
	keys[0] = 1;
    for (i = 1; i < 12; i++)
	keys[i] = (monlens[i-1] + keys[i-1]) % 7;
}
--
        Tom Reingold
        tr@samadams.princeton.edu  OR  ...!princeton!samadams!tr
        "Warning: Do not drive with Auto-Shade in place.  Remove
        from windshield before starting ignition."

newberry@nmsu.edu (Jeff Newberry) (06/25/91)

There is an article in "Computer Language" magazine in the July 1989
issue called "The Dating Game."  It has an algorithm for finding the
day of week and a host of other date functions.

Jeff Newberry
Computing Research Lab
New Mexico State University