technovelty

weblog of Ian Wienand

RSS  |  technovelty home  |  page of ian  |  ian@wienand.org

Zeller's Congruence

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)

Posted by mihir at Fri Aug 22 19:19:58 2008

its a program of C program. show me easy language to find birthdate of any person and on what week he is born.

Add a comment
*Name
*Email (not shown)
Website
*Comment:
Anti-spam:
* denotes required field

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