```
// function to return the day of the week given the date
// (01/01/1800 was supposed to be a Wednesday)
// original Turbo C, modified for Pelles C by vegaseat 8oct2004
// Pelles C free at: http://smorgasbordet.com/pellesc/index.htm
#include <stdio.h> // for printf(), scanf(), getchar()
// years ending with 00 have to be divisible by 400 to leap
// note the "&&" is a DaniWeb problem and should be a double & for AND
#define isleapyear(year) ((!(year % 4) && (year % 100)) || (!(year % 400) && (year % 1000)))
int isdatevalid(int month, int day, int year);
int weekday(int month, int day, int year);
char week[7][10] = {
"Monday","Tuesday","Wednesday","Thursday",
"Friday","Saturday","Sunday"
};
int main()
{
int month, day, year;
printf("Return the day of the week given the date.");
printf("Enter date in the form mm/dd/yyyy : ");
scanf("%d/%d/%d",&month,&day,&year);
if (isdatevalid(month,day,year))
{
printf("The day of the week for this date is %s",
week[weekday(month,day,year)]);
}
else
printf("%d/%d/%d not a valid date!",
month,day,year);
getchar(); // wait
getchar(); // 2nd wait needed
return 0;
}
//
// return 1 if date is valid, 0 otherwise.
//
int isdatevalid(int month, int day, int year)
{
if (day <= 0) return 0 ;
switch( month )
{
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 : if (day > 31) return 0 ; else return 1 ;
case 4 :
case 6 :
case 9 :
case 11 : if (day > 30) return 0 ; else return 1 ;
case 2 :
if ( day > 29 ) return 0 ;
if ( day < 29 ) return 1 ;
if (isleapyear(year)) return 1 ; // leap year
else return 0 ;
}
return 0 ;
}
//
// given month, day, year, returns day of week, eg. Monday = 0 etc.
// tested for 1901 to 2099 (seems to work from 1800 on too)
//
int weekday(int month, int day, int year)
{
int ix, tx, vx;
switch (month) {
case 2 :
case 6 : vx = 0; break;
case 8 : vx = 4; break;
case 10 : vx = 8; break;
case 9 :
case 12 : vx = 12; break;
case 3 :
case 11 : vx = 16; break;
case 1 :
case 5 : vx = 20; break;
case 4 :
case 7 : vx = 24; break;
}
if (year > 1900) // 1900 was not a leap year
year -= 1900;
ix = ((year - 21) % 28) + vx + (month > 2); // take care of February
tx = (ix + (ix / 4)) % 7 + day; // take care of leap year
return (tx % 7);
}
```

0

This is a very nostalgic problem for me.

Several years ago (so long ago that Dani was probably not born yet) I had to solve this problem. I did all sorts of pre-internet researc but could not find an answer.

Then - the aha moment

I realized that there is no information in a single date that can tell you what day of the week it fell on but if you do know the day of the week for a certain day (e.g. today) you can

- Calculate the difference in days between your known date and the date in question.
- Find the modulo 7 difference of that difference.
- Since the days of the week continuously repeat in a 7 day cycle, the modulo 7 value will determine the day of the week you want.

There are 2 caveats.

- Leap years (i.e. an extra day) occur every four years EXCEPT if the year is 0 mod 400 (e.g. 2000 was not a leap year).
- Several centuries ago (I don't recall when) a few months were dropped from the calendar (by papal decree?) to bring it back into synch with the seasons.

I wrote code to do this calculation but I can't find it, so I'll leave implementation as

"an exercise for the reader". Have fun!

1

I wrote code to do this calculation but I can't find it, so I'll leave implementation as "an exercise for the reader". Have fun!

Piece of cake considering I've already written this for my standard C library implementation. Here's the meat of it, slightly modified:

```
#include <stdio.h>
#define _LEAP_YEAR(year) (((year) > 0) && !((year) % 4) && (((year) % 100) || !((year) % 400)))
#define _LEAP_COUNT(year) ((((year) - 1) / 4) - (((year) - 1) / 100) + (((year) - 1) / 400))
const int yeardays[2][13] = {
{ -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 },
{ -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }
};
const int monthdays[2][13] = {
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
int weekday(int year, int month, int day)
{
int ydays, mdays, base_dow;
/* Correct out of range months by shifting them into range (in the same year) */
month = (month < 1) ? 1 : month;
month = (month > 12) ? 12 : month;
mdays = monthdays[_LEAP_YEAR(year)][month - 1];
/* Correct out of range days by shifting them into range (in the same month) */
day = (day < 1) ? 1 : day;
day = (day > mdays) ? mdays : day;
/* Find the number of days up to the requested date */
ydays = yeardays[_LEAP_YEAR(year)][month - 1] + day;
/* Find the day of the week for January 1st */
base_dow = (year * 365 + _LEAP_COUNT(year)) % 7;
return (base_dow + ydays) % 7;
}
```

Dates are tricky though, and this only works within the confines of ISO C library requirements.

0

can't we use a string function pls?

Not functions in `<string>`

, but a couple of functions in `<ctime>`

```
#include <iostream>
#include <ctime>
int main()
{
int month, day, year ;
std::cin >> month >> day >> year ;
// validate
std::tm tm ;
tm.tm_mon = month - 1 ;
tm.tm_mday = day ;
tm.tm_year = year - 1900 ;
tm.tm_hour = tm.tm_min = tm.tm_sec = 0 ;
tm.tm_isdst = -1 ;
static const char* const wdays[] =
{ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday","Saturday" } ;
std::time_t t = std::mktime( &tm ) ;
const std::tm* ptm = std::localtime( &t ) ;
if( ptm ) std::cout << wdays[ ptm->tm_wday ] << '\n' ;
else std::cout << "invalid date\n" ;
}
```

0

For those of you interested, there is a Python version here ...

http://www.daniweb.com/software-development/python/code/447745/day-of-week-given-a-date#

0

```
// On what day were you born?
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <fstream>
using namespace std;
long jd(int y, int m, int d);
void main()
{
int Year, Month, Day, DayOfWeek;
long Julian;
Year = 2001; // If only one time doing might I hard code the date
Month = 10;
Day = 02;
Julian = jd(Year, Month, Day); // Convert the date to Julian
DayOfWeek = Julian % 7 // The remainder should give us the day of week
switch(DayOWeek)
{
case 0:
cout << "Your birthday occurred on Monday"
break;
case 1:
cout << "Your birthday occurred on Tuesday"
break;
case 2:
cout << "Your birthday occurred on Wednesday"
break;
case 3:
cout << "Your birthday occurred on Thursday"
break;
case 4:
cout << "Your birthday occurred on Friday"
break;
case 5:
cout << "Your birthday occurred on Saturday"
break;
case 6:
cout << "Your birthday occurred on Sunday"
break;
default:
cout << " You must not have been born"
break
}
}
// Convert date to julian
long jd(int y, int m, int d)
{
y+=8000;
if(m<3) { y--; m+=12; }
return (y*365) +(y/4) -(y/100) +(y/400) -1200820 +(m*153+3)/5-92 +d-1;
}
```

Isn't it about time forums rewarded their contributors?

Earn rewards points for helping others. Gain kudos. Cash out. Get better answers yourself.

It's as simple as contributing editorial or replying to discussions labeled OP Sponsor or OP Kudos

You

This is an OP Kudos discussion and contributors
may be rewarded