2015-07-21 11 views
0

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

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; но это prints 5.
Фактически tm_wday дает согласованные результаты, но с разницей в 3 дня.
Что здесь не так?

+0

Выберите язык. C или C++ и придерживаться его. Не меняйте свой код после получения ответа. Обычно это делает ответ недействительным. –

+0

@SouravGhosh, я не вижу необходимости придерживаться только 1 из них. '' и '' доступны в C и C++ соответственно. Наличие обоих меток дает лучшую видимость. Код не изменяется, только код 'std ::' удаляется из кода, чтобы избежать некорректности с C. Это не имеет никакого значения. – iammilind

+1

Ваш код находится в 'C'. Зачем тогда тэг 'C++'? –

ответ

4

Вы получили месяц неправильно, tm_mon это смещение с января , поэтому в июле - 6. Из справочной системы:

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) или аналогичным.

+0

Мой плохой. Я никогда не заботился о проверке месяца :-). С помощью инициализатора с привязкой, я считаю, что остальные поля будут автоматически инициализированы до 0. Следовательно, 'memset()' не требуется. – iammilind

0

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

Live Example

Смежные вопросы