2012-06-28 9 views
6

エポックから秒を表すtime_t値から整数値として時間、分、秒を抽出したいとします。time_tから時間を抽出するには?

時間の値が正しくありません。どうして? gmtime()

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

#include <unistd.h> 

int main() 
{ 
    char buf[64]; 

    while (1) { 
     time_t t = time(NULL); 
     struct tm *tmp = gmtime(&t); 

     int h = (t/360) % 24; /* ### My problem. */ 
     int m = (t/60) % 60; 
     int s = t % 60; 

     printf("%02d:%02d:%02d\n", h, m, s); 

     /* For reference, extracts the correct values. */ 
     strftime(buf, sizeof(buf), "%H:%M:%S\n", tmp); 
     puts(buf); 
     sleep(1); 
    } 
} 

出力(時間は10でなければなりません)

06:15:35 
10:15:35 

06:15:36 
10:15:36 

06:15:37 
10:15:37 
+0

"int h =(t/3600)%24; ..."は、_assumption_time_tが整数秒になるようにします。これは一般的ですが、Cで定義されていません。移植可能なコードに 'gmtime()/ localtime()'や 'difftime()'を使用してください。 – chux

答えて

5

あなたの呼び出しは、すでにそれをしない、結果struct tmは、すべてのフィールドを持っています。 the documentationを参照してください。言い換えれば

、それはあなたのコード内で手動で変換を行うためにscarily大きな数を含む回避するのでちょうど

printf("hours is %d\n", tmp->tm_hour); 

私は、これは適切な方法であることを主張するだろう。それは他の誰かの問題(つまり、それを抽象化する)にすることで、最良の方法でそうします。だから、0を追加するのではなく、gmtime()を使用してコードを修正してください。

タイムゾーンについても考えてください。

+0

ありがとうございますが、問題は次のとおりです。計算が正しくないのはなぜですか。 (私はstruct tmを使用する方がよいアプローチだということに同意します)。 –

+2

@ダナ:クズあなたは次のように分かれています:t/360はどこにあるべきですか?3600(覚えておきます60 * 60) – Abhineet

+0

Hm、質問は実際にでした:質問)。なぜ私は自分自身で変換をやめてはならないのかという良い理由があるので、答えを受け入れる。 –

11
int h = (t/3600) % 24; /* ### Your problem. */ 
+0

Doh、なぜ私はその明白なものを見なかったのですか? –

+0

誰もが時々バグを見て、それを見ないと思う。それは私にとってはしばしばです;) –

関連する問題