2016-09-12 4 views
2

Я начинаю, и я пытаюсь рассчитать, сколько дней существует между двумя датами, но я не понимаю ясно о time.h, может кто-то указать на мои ошибки? Потому что sec = 0 после печати. Спасибо.Число дней между двумя датами ввода с клавиатуры

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

main(){ 



    double sec; 

    struct tm BD; 
     BD.tm_mday;   
     BD.tm_mon;   
     BD.tm_year; 

    struct tm KT; 
     KT.tm_mday;   
     KT.tm_mon;   
     KT.tm_year; 

    printf("Start date: "); 
    scanf("%d %d %d",&BD.tm_mday,&BD.tm_mon,&BD.tm_year); 

    printf("End date: "); 
    scanf("%d %d %d",&KT.tm_mday,&KT.tm_mon,&KT.tm_year); 

    sec = difftime(mktime(&KT),mktime(&BD)); 

    printf("%f",sec); 

// date= sec/86400 // 

    return 0; 
} 
+5

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

+1

Если у вас есть доступ к компилятору C++ 11 и выше, посмотрите на пространство имен std :: chrono http://en.cppreference.com/w/cpp/chrono – Ceros

+1

@NathanOliver Жаль, что я этого не заметил и уже отредактирован C. Вы можете мне показать свои ошибки? Вход в мой день кажется плохим. –

ответ

0

код не удается установить необходимые поля перед вызовом mktime(). Результат: неопределенное поведение.

struct tm BD; 

// these 3 lines of code do nothing 
BD.tm_mday;   
BD.tm_mon;   
BD.tm_year; 

scanf("%d %d %d",&BD.tm_mday,&BD.tm_mon,&BD.tm_year); 
// Only 3 of the 9+ fields of `BD` have a defined value. 

Вместо нулевой структуры сначала и установлены tm_isdst. Чтобы правильно использовать mktime(), все поля должны быть установлены сначала, кроме tm_yday и tm_wday. Эти 2 поля игнорируются для чтения. Все поля обновляются до их основного диапазона.

В struct tm может иметь больше, чем заданный набор из 9 полей, легко для инициализации полех всей структуры до нуля, чтобы обеспечить первый все поля установлено. Кодеры часто забывают установить tm_isdst и другие необязательные поля, приводящие к непоследовательным результатам.

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

int main(void) { 
    struct tm BD = { 0 }; 
    // Set to -1 to direct mktime() to decide if DST applies or not. 
    // or set to 0, or 1, if a specific DST flag is desired. 
    BD.tm_isdst = -1; 
    struct tm KT = { 0 }; 
    KT.tm_isdst = -1; 

    printf("Start date: "); 
    if (3 != scanf("%d %d %d", &BD.tm_mday, &BD.tm_mon, &BD.tm_year)) return -1; 

    printf("End date: "); 
    if (3 != scanf("%d %d %d", &KT.tm_mday, &KT.tm_mon, &KT.tm_year)) return -1; 

    double sec = difftime(mktime(&KT), mktime(&BD)); 

    printf("%f\n", sec); 
    return 0; 
} 
1

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

#include <stdio.h> 
#include <time.h> 
int main() { 
    struct tm start_date; 
    struct tm end_date; 
    time_t start_time, end_time; 
    double seconds; 
    printf("Start date: "); 
    scanf("%d %d %d",&start_date.tm_mday ,&start_date.tm_mon,&start_date.tm_year); 
    printf("End date: "); 
    scanf("%d %d %d",&end_date.tm_mday,&end_date.tm_mon,&end_date.tm_year); 
    start_date.tm_hour = 0; start_date.tm_min = 0; start_date.tm_sec = 0; 
    end_date.tm_hour = 0; end_date.tm_min = 0; end_date.tm_sec = 0; 
    start_time = mktime(&start_date); 
    end_time = mktime(&end_date); 
    seconds = difftime(end_time, start_time); 
    printf ("%d days difference\n", (int) (0.5 + seconds/(60*60*24))); 
    return 0; 
} 

Тест

Start date: 23 11 2017 
End date: 27 11 2017 
4 days difference