## Program to find the day of the week for a given date

• Post author:
• Post published:November 11, 2023

### 1.0 Day of Week

The Gregorian calendar was adopted in 1582. The formula to find the day of the week for any date after 1582 is,

```d = N + ⌊2.6M - 0.2⌋ + Y + ⌊Y/4⌋ + ⌊C/4⌋ - 2C
- (1 + L)⌊M/11⌋ (mod 7)
```

where,
d is the day of the week. d is 0 for Sunday, 1 for Monday, …, 6 for Saturday.
N is the day of the month.
M is the month. M = 1 for March, 2 for April, …, 10 for December, 11 for January and 12 for February.
Y is the last two digits of the year.
C is the first two digits of the year. For example, for the year 2023, C is 20 and Y is 23.
L is 1 for leap years, 0 otherwise. Any year divisible by 4 and not divisible by 100 is a leap year. However, the years divisible by 400 are also leap years. For example, the years 1992, 2000 and 2016 are leap years whereas 1800, 1900 and 2023 are not.

### 2.0 Example Program

An example program in C implementing the above formula is given below. We have a function, day_of_week (), which takes in day, month and year as integers, dd, mm and yyyy. The month argument is the usual 1 for January, 2 for February, …, and 12 for December.

```// day_of_week.c: find the day of the week for a given date

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int day_of_week (int day, int month, int year) // returns 0 for Sunday, 1 for Monday ...
{
int N = day;
int M = (month <= 2) ? month + 10 : month - 2;
int C = year / 100;
int Y = year % 100;
int L = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

int temp = N + floor (2.6 * M - 0.2) + Y + floor (Y / 4) + floor (C / 4)
- 2 * C - (1 + L) * floor (M / 11);
// if temp is negative, add a multiple of 7 to make it positive
if (temp < 0) {
int n = ceil ((double) (abs (temp)) / 7);
temp += 7 * n;
}
return temp % 7;
}

#define BUFFER_SIZE 1024
char buffer [BUFFER_SIZE];

int main (int argc, char *argv [])
{
int day, month, year;

printf ("Date (dd mm yyyy) : ");
while (fgets (buffer, sizeof (buffer), stdin)) {
sscanf (buffer, "%d %d %d", &day, &month, &year);
int weekday = day_of_week (day, month, year);
switch (weekday) {
case 0: printf ("Sunday\n");
break;
case 1: printf ("Monday\n");
break;
case 2: printf ("Tuesday\n");
break;
case 3: printf ("Wednesday\n");
break;
case 4: printf ("Thursday\n");
break;
case 5: printf ("Friday\n");
break;
case 6: printf ("Saturday\n");
break;
default: printf ("Error (%d)\n", weekday);

}
printf ("Date (dd mm yyyy) : ");
}
printf ("\n");
return 0;
}
```

In most cases, the expression temp is positive and temp mod 7 is calculated as temp % 7, giving the day of the week. However, in some cases, especially for the dates at start of a century, like January 1, 1900, or January 1, 2000, the expression temp becomes negative. In these cases, we add a multiple of 7 to it to make it a positive number, and then the % operator can be used for finding the modulus.

We can compile and run the above program.

```\$ gcc day_of_week.c -o day_of_week -lm
\$ ./day_of_week
Date (dd mm yyyy) : 11 11 2023
Saturday
Date (dd mm yyyy) : 1 1 2000
Saturday
Date (dd mm yyyy) : 29 02 1984
Wednesday
Date (dd mm yyyy) : 1 1 2100
Friday
Date (dd mm yyyy) :
\$
```