Посчитать день месяца
Есть задача, нужно посчитать день месяца имея:
- Год
- Месяц
- Номер недели в месяце
- Номер дня в неделе
Даты меньше 2021 года не учитываются в задаче.
Пример: При подаче 2021 год, Август, Первая неделя, Вторник результат будет 3
Думал использовать strptime(), но она не работает с номером недели в месяце. Поэтому, наверно, сначала, нужно посчитать номер недели в году из входных данных, но тут я застрял. Помогите, пожалуйста. Можно, наверно даже, и так посчитать, без strptime()
Ответы (1 шт):
Автор решения: Sergey
→ Ссылка
Воспользуемся структурой
struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
объявленной в <time.h>. Выясним время (time_t) начала первого дня интересуещего нас месяца:
struct tm wrk;
struct tm *first_day;
time_t tt;
wrk.tm_year = year; // Год нам задан
wrl.tm_mon = mon; // Тоже известен
wrk.tm_mday = 1; // Начало месяца
/*
Функция mktime() преобразует временную структуру с разбивкой, выраженную как местное время, в представление календарного времени. Функция игнорирует значения, предоставленные вызывающей стороной в полях tm_wday и tm_yday.
*/
tt = mktime(&wrk);
/*
Теперь, с помощью функции localtime() можно выполнить обратное действие - из времени начала первого дня месяца получить день недели этого дня.
*/
first_day = localtime(tt);
/*
В поле first_day->tm_wday содержится именно то, что нам и нужно - номер (0-6) дня недели первого числа заданного года и месяца.
В месяце может быть от 4-х до 6-и недель. Вычислим СМЕЩЕНИЕ воскресенья
в первой неделе месяца, относительно первого числа.
*/
int wd_offset;
wd_offset = -first_day->tm_wday; // Обратите внимание на знак "минус"!
/*
Теперь берём номер недели, умножаем на 7 и прибавляем смещение
*/
day_of_moon = 7 * week_num + wd_offset;
Как-то так, приблизительно :-)