0

時間関数に違いがあり、その理由は何だろうと思っていました。現在、localtime、mktime、strftime、および difftime を使用しています。

time_t ltime; 
ltime = time(NULL); 
StartTM = localtime(&ltime); 
time_t time1 = mktime(StartTM ); 
char startbuffer [128]; 
strftime( start_buffer, 128, "%H:%M:%S", StartTM ); 
<<Do some stuff, take some time >>>
time_t ttime; 
ttime = time(NULL); 
StopTM = localtime(&ttime); 
time_t time2 = mktime(StopTM ); 
char stop_buffer [128]; 
strftime( stop_buffer, 128, "%H:%M:%S:", StopTM ); 
double wtinsec = difftime(time2, time1); 

実行すると、出力は次のようになります。

ストップバッファ=08:46:18

開始バッファ=08:44:11

wtinsec=129

手動で開始から停止を差し引くと、時間の長さは 2:07 ですが、合計秒数 (difftime) は 2:09 になります。両方の時間は両方の計算に同じ生データ (time1、time2) を使用しているため、最初の考えでは、strftime 変換の精度不足と difftime の組み合わせが原因でした。

しかし、その差は一定ではありません。2 つのローカル コール間の時間が短い場合 (10 秒など)、違いはありません。ただし、2 回の呼び出しの間の時間が長くなるにつれて、合計時間の差は大きくなります。2 分で 2 秒、5 分で 4 秒など...

これが発生している理由と、時間を追跡して別の時間を減算できる、できればマイクロ/ミリ秒単位のより正確な (C++ で) ものはありますか?

ありがとう。

4

1 に答える 1

1

との値は同じである必要がありますltimetime1往復してlocaltime()mktime()あなたが始めた答えをあなたに与えるはずです。同様に、もちろん、ttimetime2

このCコードは、予想される動作を示しています。何が問題になっているのかを見つけるために、コードをよく見る必要があります。

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

int main(void)
{

    time_t     ltime = time(NULL); 
    struct tm *start = localtime(&ltime); 
    time_t     time1 = mktime(start); 
    char startbuffer[128]; 
    strftime(startbuffer, sizeof(startbuffer), "%H:%M:%S", start); 
    printf("lt = %10lu, t1 = %10lu, time = %s\n",
           (unsigned long)ltime, (unsigned long)time1, startbuffer);

    sleep(10);

    time_t     ttime = time(NULL); 
    struct tm *finis = localtime(&ttime); 
    time_t     time2 = mktime(finis); 
    strftime(startbuffer, sizeof(startbuffer), "%H:%M:%S", finis); 
    printf("lt = %10lu, t1 = %10lu, time = %s\n",
           (unsigned long)ttime, (unsigned long)time2, startbuffer);

    printf("diff time = %.2f\n", difftime(time2, time1));

    return(0);
}

サンプル出力(Mac OS X 10.7.5から):

lt = 1358284665, t1 = 1358284665, time = 13:17:45
lt = 1358284675, t1 = 1358284675, time = 13:17:55
diff time = 10.00

私が行ったのと同じように、コード内の値を確認することをお勧めします。struct tm構造の内容を印刷する場合としない場合があります。繰り返されるコードの7行のブロックを処理する関数を作成する価値があります。もちろん、戻るために必要にtime1なるtime2ので、「メイン」コードで違いを出すことができます。またlocaltime()、同じポインタを2回返す可能性があることにも注意してください。終了時刻で呼び出した後は、開始時刻の構造を確実に使用することはできませんlocaltime()

于 2013-01-15T21:19:56.590 に答える