Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!swrinde!mips!spool.mu.edu!uwm.edu!linac!att!princeton!newross!samadams!tr
From: tr@samadams.princeton.edu (Tom Reingold)
Newsgroups: comp.os.msdos.programmer
Subject: finding the day of week from the date
Message-ID:
Date: 21 Jun 91 17:56:30 GMT
Sender: news@newross.Princeton.EDU (USENET News System)
Organization: Princeton University, Dept. of Computer Science
Lines: 83
Here is a sample program that finds the day of the week, given the
date. It works for this century only. Making it work for any century
is "left as an exercise to the reader".
#include
#include
#include
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."