2012-02-12 9 views
3

timevalをtime_tに変換するにはどうすればよいですか?私は変換しようとしています: umtp-> ut_tv time_tに私はdifftime(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);' t2 - t1'を返す関数を書く必要があります。または、あなたが好きな場合には戻り値の型を 'double'にすることができます。したがって、' difftime() 'とのプラグイン互換性がよります。 –

+0

なお、ここに示すコードはコンパイルされません。変数 'ut_tv'を2つの異なる型(無名structと' struct timeval'として)で2回定義します。 –

+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}; 

これにより、以前の精度をすべて保持できます。 C-キャストを使用せずに

+0

私は使用していた使用することができました " - " "の代わりに"。 before ".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; 
関連する問題