получить первый день данной недели - PullRequest
2 голосов
/ 30 октября 2010

У меня текущая неделя в виде целого числа (43 на данный момент). Мне нужна дата на понедельник в формате вроде «Пн Окт 25».

Думал, что смогу сделать это с помощью функции из, но я не знаю, как это сделать. Есть предложения?

EDIT: Я попробовал предложение от Р., но оно не дает ожидаемого результата. Я неправильно это реализовал?

time_t monday;
char date_format[32];
time_t now = time(NULL);
struct tm *tm = localtime(&now);

tm->tm_yday = 0; // reset to Jan 1st
tm->tm_hour = 24 * 7 * WEEK + 24; // goto Sun and add 24h for Mon

monday = mktime(tm);

strftime(date_format, 31, "%a : %D", tm);

printf("%s\n", date_format);

Ответы [ 2 ]

2 голосов
/ 30 октября 2010

Функция mktime может сделать это. Просто инициализируйте struct tm foo, чтобы представить первый день года (или первый день первой недели года, если необходимо), затем установите tm_hour на 24*7*weeknum и позвоните mktime. Это нормализует дату для вас.

2 голосов
/ 30 октября 2010

Примечание: не тестировалось, но с учетом текущего года это должно быть сделано:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...