Básicamente, existen dos enfoques:
La manera fácil/pragmática: resolver la tarea, y olvidarse de todo lo demás. Aquí puede consultar la documentación del mktime()
(encontrará un ejemplo basado en mktime a continuación).
La manera científica/de ingeniería: ¡aprenda a saber cómo funciona! Puede comenzar en el great wikipedia article about the gregorian calendar. Léelo, entiéndelo y escriba el código que implementa los algoritmos subyacentes (que son conocidos, no hay ciencia espacial, es posible). Esto mejorará mucho sus habilidades (de hecho, realmente debería hacer tal cosa, tal vez no el calendario sino otro tema, le dará un gran salto en la comprensión de todo cosas).
Ahora, un código pragmático para empezar. mktime()
tiene una gran característica: conoce los detalles del calendario y acepta, por ejemplo, una fecha "2010-01-60" y la convertirá al 29 de febrero de 2010. Pero esto solo funcionará para fechas posteriores a 1970. No funcionará para fechas anteriores (aunque no estoy 100% seguro, pero no debería) t funciona, porque el tiempo de Unix comienza el 1 de enero de 1970, pero intente con otras fechas, tal vez mktime()
no está restringido a tiempo Unix).
pseudo-código, esta opción se imprime cada día en una sola línea (AAAA-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]);
}
}
Este código hace caso omiso de los años bisiestos. ¡Todavía tiene que ajustarlo para que sea correcto para los años bisiestos! Además, el resultado aún no es muy bonito, solo una línea por día.
EDITAR: producción agregada de días laborables.
Si usted puede hacer que el programa imprime la primera semana de enero, tendrá el programa 90% hecho. –
¿Cómo lo haría comenzar el mes en un día en particular? –