Примечание: не тестировалось, но с учетом текущего года это должно быть сделано:
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
и обрезать его вывод, чтобы просто отобразить день недели, день месяца и сокращение названия месяца.