RSS | technovelty home | page of ian | ianw@ieee.org
Here's one for your junkcode if you haven't already come across it
(maybe I'm the only one). Zeller's Congruence (or rule, or algorithm,
or ...) allows you to find the day of the week for any given date.
Most people would probably use mktime(), but it recently
came up on a glibc list where a guy was doing millions of
calls; it can get pretty slow.
If you're keen, there is an explanation of how to derive (one version of) it. The most trouble free version I could find looks like
/* Zeller's Congruence to determine day of week */
int get_dayofweek(int date)
{
int d = date % 100;
int m = (date % 10000) / 100;
int y = date / 10000;
if (m < 3)
{
m = m + 12 ;
y = y - 1;
}
return ((2 + d + (13*m-2)/5 + y + y/4 - y/100 + y/400) % 7);
}
int main(void)
{
/* my birthday */
int bday = get_dayofweek(19800110);
char *d;
switch(bday)
{
case 0:
d = "Sunday";
break;
case 1:
d = "Monday";
break;
case 2:
d = "Tuesday";
break;
case 3:
d = "Wednesday";
break;
case 4:
d = "Thursday";
break;
case 5:
d = "Friday";
break;
case 6:
d = "Saturday";
break;
}
printf("%s\n", d);
}
So it looks like I was born on a Thursday. Cool!
posted at: Wed, 08 Jun 2005 15:55 | in /code/hacks | permalink | add comment (1 others)

This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.