Как найти день недели `tm_wday` от заданной даты?

Чтобы найти день (число) для данной даты, я написал код ниже, используя <ctime>:

tm time {ANY_SECOND, ANY_MINUTE, ANY_HOUR, 21, 7, 2015 - 1900};
mktime(&time); //                          today's date
PRINT(time.tm_wday);  // prints 5 instead of 2 for Tuesday

Согласно документации, tm_wday может держать ценность среди [0-6]где 0 — воскресенье. Следовательно, для вторника (сегодня) он должен вывести 2; но это отпечатки 5.
На самом деле tm_wday дает последовательные результаты, но с разницей в 3 дня.
Что здесь не так?

0

Решение

Вы ошиблись месяцем, tm_mon это смещение с января, поэтому июль равен 6. С man-страницы:

tm_mon Количество месяцев с января в диапазоне от 0 до 11.

Это выводы 2:

#include <stdio.h>
#include <string.h>
#include <time.h>

int main(void) {
struct tm time;
memset(&time, 0, sizeof(time));

time.tm_mday = 21;
time.tm_mon = 6;
time.tm_year = 2015-1900;

mktime(&time);

printf("%d\n", time.tm_wday);

return 0;
}

Обратите внимание, что вы должны инициализировать остальные поля с 0 memset(3) или похожие.

4

Другие решения

Причина, по которой вы получаете неверный вывод, заключается в том, что вы используете неправильный месяц. tm_mon начинается с 0, а не с 1. Вы можете увидеть tghis, используя этот код:

tm time {50, 50, 12, 21, 7, 2015 - 1900};
time_t epoch = mktime(&time);
printf("%s", asctime(gmtime(&epoch)));

Выход:

Fri Aug 21 12:50:50 2015

Живой пример

0

По вопросам рекламы [email protected]