Basically, there are two approaches:
The easy / pragmatical way: Solve the task, and forget about everything else. Here you may check documentation for mktime()
(you'll find an example based on mktime below..).
The scientific / engineering way: Learn to know how it works! You can start at the great wikipedia article about the gregorian calendar. Read it, understand it, and write code that implements the underlying algorithms (which are known, no rocket science, it is possible). This will improve your skills a lot (in fact, you really should do such a thing, maybe not the calender but another topic, it will give you a big leap in understanding all things).
Now some pragmatic code to start with. mktime()
has a great feature: it knows the calender details, and it accepts e.g. a date "2010-01-60" and will convert it into February 29th, 2010. But, this will only work for dates after 1970. It will not work for earlier dates (though I am not 100% sure, but it shouldn't work, because unix time starts at January 1st, 1970, but try with other dates, maybe mktime()
is not restricted to unix time).
Pseudo-Code, this prints each day on a single line (YYYY-MM-DD):
void print_cal( int year ) {
static char weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
struct tm tm;
for( int day=0; day<365; ++day ) {
memset( &tm, 0, sizeof(tm) );
tm.tm_year = year - 1900;
tm.tm_mday = day;
mktime( &tm ); // modifies tm
printf( "%04d-%02d-%02d, %s\n", tm.tm_year, tm.tm_mon+1, tm.tm_mday, weekdays[tm.tm_wday] );
}
}
This code ignores leap years. You still have to adjust it to be correct for leap years! Also the result is not very pretty yet, just one line per day.
EDIT: added output of weekdays.