2012-02-12 6 views
3

Как преобразовать timeval в time_t? Я пытаюсь преобразовать: umtp-> ut_tv в time_t, поэтому я могу использовать diffftime (a, b).Преобразование timeval в time_t

struct { 
    int32_t tv_sec;   /* Seconds */ 
    int32_t tv_usec;  /* Microseconds */ 
      } ut_tv;     /* Time entry was made */ 
struct timeval ut_tv;  /* Time entry was made */ 
+0

Вы уверены, что микросекунды не имеют значения для вас? Если это так, то вам нужно написать собственную 'struct timeval difftimeval (const struct timeval * t1, const struct timeval * t2);' function, которая возвращает 't2 - t1'. Или вы можете определить тип возврата как 'double', если хотите, так что он почти совместим с' diffftime() '. –

+0

Кстати, показанный код не будет компилироваться; вы определяете переменную 'ut_tv' дважды с двумя разными типами (как анонимная структура и как' struct timeval'). –

+0

Откуда вы получили это определение 'timeval'? Тип 'tv_sec' должен быть' time_t', и преобразование не требуется, только усечение. –

ответ

8

time_t просто хранит секунды, так

time_t time = (time_t)ut_tv.tv_sec; 

Должен работать, но так как вы просто ищете разницы, всегда есть магия вычитания.

struct timeval diff = {a.tv_sec-b.tv_sec, a.tv_usec-b.tv_usec}; 

Это позволяет вам сохранить всю точность, которую вы имели раньше.

+0

Я использовал «->» вместо «.» перед «.tv_sec» – user994165

+5

Вычитание неправильно нормировано; если 'a.tv_usec = 123456' и' b.tv_usec = 654321', то вы получите отрицательное дробное время, которое должно быть нормализовано до положительного значения, а компонент 'tv_sec' настроен соответствующим образом. Конечно, если 'a' доходит до' b', возможно, обе части результата должны быть отрицательными? Это «сегментированная арифметика», и обычно проще оставить знак в отдельном поле. Если нет отдельного поля знака, то оба сегмента значений должны иметь один и тот же знак (или один или другой может быть равен нулю). –

+0

Я бы сказал, что все, кроме самого значимого поля, всегда должны быть неотрицательными. –

1

Без использования с-броска, вы можете просто сделать это:

struct timeval rawtime_s_us; 
gettimeofday(&rawtime_s_us, NULL); 
time_t rawtime_s = rawtime_s_us.tv_sec;