2016-07-13 2 views
-1

Я написал следующий код, который вычисляет разницу во времени между двумя заданными временами. Задача, однако, также требовала осознания перехода через полночь. Я не могу придумать, как реально справиться с этим в коде, за исключением того, что дельта сообщается как положительное значение. Я также искал в Интернете и нашел другой код, который, похоже, не справляется с этим лучше. Пожалуйста, обратите внимание; Я спрашиваю об алгоритме. Я не ищу функцию, которая делает это. Вот мой код:расчет разницы во времени между двумя разными временами - вечное время

struct time { 
    int hour; 
    int minutes; 
    int seconds; 
}; 

int main (void) 

{ 
    struct time timeDiff (struct time now, struct time later); 
    struct time result, one, two; 
    printf("Enter the first time (hh:mm:sec): "); 
    scanf("%i:%i:%i", &one.hour, &one.minutes, &one.seconds); 
    printf("Enter the second time (hh:mm:sec): "); 
    scanf("%i:%i:%i", &two.hour, &two.minutes, &two.seconds); 
    result = timeDiff(one, two); 
    printf("Time is: %.2i:%.2i:%.2i\n", result.hour, result.minutes, result.seconds); 
    return 0; 
} 
struct time timeDiff (struct time now, struct time later) 
    { 
    struct time timeDiff; 
    timeDiff.hour = later.hour - now.hour; 
    timeDiff.minutes = later.minutes - now.minutes; 
    timeDiff.seconds = later.seconds - now.seconds; 
    return timeDiff; 
    } 

Вот код, который я нашел в Интернете:

#include <stdio.h> 
struct time 
{ 
     int hour; 
     int minute; 
     int second; 
}; 
int main(void) 
{ 
     struct time time3; 
     //struct time get_time(struct time d); 
     //struct time elapsed_time(struct time d, struct time e); 
     int convert_to_seconds(struct time d); 
     int elapsed_time(int d, int e); 
     struct time conver_to_normal_time(int a); 
     struct time time1 = { 3, 45,15}; 
     struct time time2 = { 9, 44, 03}; 
     int a, b, c; 
     a = convert_to_seconds(time1); 
     b = convert_to_seconds(time2); 
     c = elapsed_time(a, b); 
     time3 = conver_to_normal_time(c); 
     printf(" %d:%d:%d", time3.hour, time3.minute, time3.second); 
     return 0; 
} 
struct time get_time(struct time d) 
{ 
     printf("Give me the time\n"); 
     scanf(" %d:%d:%d", &d.hour, &d.minute, &d.second); 
} 
int convert_to_seconds(struct time d) 
{ 
     struct time time1_seconds; 
     int totalTime1_seconds; 
     time1_seconds.hour = d.hour * 3600; 
     time1_seconds.minute = d.second*60; 
     time1_seconds.second = d.second; 
     totalTime1_seconds = time1_seconds.hour + time1_seconds.minute + time1_seconds.second; 
     return totalTime1_seconds; 
     totalTime1_seconds = time1_seconds.hour + time1_seconds.minute + time1_seconds.second; 
     return totalTime1_seconds; 
} 
int elapsed_time(int d, int e) 
{ 
     int result; 
     result = d - e; 
     return result; 
} 
struct time conver_to_normal_time(int a) 
{ 
     struct time final_elapse_time; 
     final_elapse_time.hour = a/3600; 
     final_elapse_time.minute = (a/60) % 60; 
     final_elapse_time.second = a % 60; 
     return final_elapse_time; 
} 
+0

Похоже, что у вас есть решение вашей проблемы (знак дельта), так что в чем вопрос? –

+2

Вы сделали свое собственное вычитание по времени без учета каких-либо «заимствований». Если бы это было сотни, десятки и единицы, вы бы знали, как их вычесть. За секунды вы «заимствовали» 60 секунд с минут и т. Д. Попробуйте на бумаге. –

+0

Привет, Скотт, да, я пытался понять, что это лучший способ справиться с этим, и если бы я сделал какие-то неправильные предположения. Комментарий Ванне помог. – maverick

ответ

1

Решение вы нашли в Интернете действительно справиться с этой проблемой довольно хорошо, это нужно только обрабатывать изменение дней добавляя количество секунд в день к разнице, когда ниже 0. Ваша проблема немного выше, потому что в вашем решении у вас есть негативная проблема, когда любое из новых значений меньше старого. Поэтому, если у вас есть что-то вроде 00:00:50 => 00:01:10, вы получите 00:01:-40. Переходя к секундам, разница легче подсчитать.

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

if (timeDiff.seconds < 0) { 
    timeDiff.seconds += 60; 
    timeDiff.minutes -= 1; 
} 

И аналогично вам придется обрабатывать минуты, затем часы. Также важно, чтобы вы делали их в порядке, чтобы накапливаться вверх. Это связано с тем фактом, что вы делаете вычитание, но все значения связаны, поэтому вы не носите от минут до нескольких секунд, часов в минутах, а затем неявно через несколько часов.

+0

@ Davek- Я запустил оба кода, и они оба выплюнули отрицательные значения для интервалов дельты с полуночью/полуднем. Я работаю над другим исходным кодом для вычисления прошедших дней, а затем я могу объединить все это вместе. Ваш совет - это то, что мне нужно для решения проблемы разницы во времени. – maverick

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