# Zeller's Congruence

Wed 08 June 2005

In hacks.

Ian Wienand

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!