Рассчитайте разницу между двумя раз в два разных дня

Я пытаюсь определить разницу во времени между двумя моментами, которые я представляю как целые числа без знака (в sturct) следующим образом:

unsigned int day; unsigned int month; unsigned int year; unsigned int hour; unsigned int mins; unsigned int seconds; 

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

 time1 = hours*3600 + mins*60 + seconds; time1 = hours2*3600 + mins2*60 + seconds2; //time2 will always be less than time1 time_diff_secs = time1_secs - time2_secs; time_diff_mins = time_diff_secs / 60; time_diff_secs = time_diff_secs % 60; 

это производит этот вывод:

 Time mayday was issued: 13 Hours 4 Mins 0 Seconds Time mayday was recieved: 13 Hours 10 Mins 0 Seconds Time between sending and receiving: 6.00Mins 

это правильно, но когда у меня есть два раза, которые есть в разные дни, я получаю это как результат:

 Time mayday was issued: 23 Hours 0 Mins 0 Seconds Time mayday was recieved: 0 Hours 39 Mins 38 Seconds Time between sending and receiving: 71581448.00Mins 

Это явно неверно, я не уверен, как продвигаться отсюда, фактический результат должен составлять 40 минут, а не 71,5 миллиона.

Вы получаете недостаточное количество. Попробуйте это (работает независимо от того, signed ли переменные или нет):

 if (time1_secs < time2_secs) { // New day. Add 24 hours: time_diff_secs = 24*60*60 + time1_secs - time2_secs; } else { time_diff_secs = time1_secs - time2_secs; } time_diff_mins = time_diff_secs / 60; time_diff_secs = time_diff_secs % 60; 

Другой способ сделать это, используя стандартную библиотеку C, – единственное преимущество этого – вам не нужно беспокоиться о том, что ваши даты накладываются друг на друга, или проблемы с перекрывающимися границами месяцев + бессмысленность високосного года:

 unsigned int day; unsigned int month; unsigned int year; unsigned int hour; unsigned int mins; unsigned int seconds; time_t conv(void) { time_t retval=0; struct tm tm; tm.tm_mday=day; tm.tm_mon=month -1; tm.tm_year=year - 1900; tm.tm_hour=hour; tm.tm_min=mins; tm.tm_sec=seconds; tm.tm_isdst=-1; retval=mktime(&tm); return retval; } int main() { time_t start=0; time_t end=0; time_t diff=0; // assign day, month, year ... for date1 start=conv(); // assign day, month, year ... for date2 end=conv(); if(start>end) diff=start - end; else diff=end - start; printf("seconds difference = %ld\n", diff); return 0; } 

+ Изменить

 time_diff_secs = time1_secs - time2_secs; 

в

 time_diff_secs = abs(time1_secs - time2_secs) % 86400; 

Это заставит его быть минимальной разницей времени между обоими временами и будет работать, даже если вы добавите дни, месяцы и т. Д. time_diff_secs вычислению time_diff_secs .