Примечание: Не тестировался, но, учитывая текущий год, это должно сделать это:
const char *months[12]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep",
"Oct","Nov","dec","Jan"};
/* Start with January 1st of the current year */
struct tm curYear={
0, // secs
0, // mins
0, // hours
1, // Day of month
0, // Month (Jan)
year,
0, // wday
0, // yday
0}; // isdst
/* Offset the number of weeks specified */
time_t secsSinceEpoch=mktime(&curYear)+
weekNum*86400*7; /* Shift by number of weeks */
struct tm *candidateDate=gmtime(&secsSinceEpoch);
/* If the candidate date is not a Monday, shift it so that it is */
if (candidateDate->tm_wday!=1)
{
secsSinceEpoch+=(86400*(candidateDate->tm_wday-1));
candidateDate=gmtime(&secsSinceEpoch);
}
printf("Mon %s %d",months[candidateDate->tm_mon],candidateDate->tm_mday\n");
Вы, возможно, придется скорректировать формулы в этом коде в зависимости от того, что именно вы имеете в виду неделю 43 в конкретном году или для соответствия ISO-8601, например. Тем не менее, это должно предоставить вам хороший код плиты котла, чтобы начать работу. Вы также можете параметризовать день недели, чтобы он не был жестко закодирован.
Кроме того, если вы хотите, вы можете избежать массива месяцев и вынуждены отформатировать время, обрезая результат функции ctime
, который просто так отображает больше, чем вы просили. Вы передадите ему указатель на значение secsSinceEpoch
и обрезаете его вывод, чтобы отобразить только день недели, день месяца и аббревиатуру названия месяцев.
Удачи. ISO-8601 определяет, что означает «номер недели» (т. Е. Как определить, какая дата дня 1 неделя 1, в зависимости от того, какой день недели начинается в году). В частности, неделя 1 - какая бы неделя не была первой четверть года. Но не все используют это определение последовательно. Поэтому, прежде чем вы сможете написать какой-либо код, вы должны знать, что на самом деле означает вход. –
Доступные решения зависят от вашей среды. –
Помните, что этот ответ изменится в зависимости от того, в каком году он. –