1

Cに次の形式で時間がかかる関数があるかどうか疑問に思っていました(現在の日付と秒単位の時間はエポック形式です)

a.1343323725
b.1343326383

そして、時間:分:秒の2つの時間の差として結果を返します


混乱して申し訳ありませんが、私の要点を明確にするために、ユーザーの現在の時間を取得するコードを作成し、コードのブロックを実行して時間を再度取得します。そして、その差を文字列リテラルとして hrs:mins:sec に変換できるかどうか疑問に思っていました。

#include <sys/time.h>
#include <stdio.h>
int main(void)
{
        struct timeval tv = {0};
        gettimeofday(&tv, NULL);
        printf("%ld \n", tv.tv_sec);
        //Execte some code
         gettimeofday(&tv, NULL);
        return 0;
}
4

2 に答える 2

1
 unsigned diff = b-a;
 printf("%u:%u:%u", diff/3600, (diff % 3600)/60, diff % 60);
  • diff / 3600時間です。
  • (diff % 3600) / 60残り分です
  • (diff % 3600) % 60に等しいdiff % 60残りの秒数

制限: このコードは、約 136 年を超える差分では機能しません。

注: パフォーマンス メーターに gettimeofday を使用することはお勧めできません。使用するのに最適な関数は、CLOCK_MONOTONIC クロック ID を指定した clock_gettime です (壁時計の時間変更の影響を受けません)。ただし、2.6 より前の Linux カーネルでは CLOCK_MONOTONIC が機能しないことに注意してください。使用前に時計の可用性を確認してください。

于 2012-07-26T19:10:09.537 に答える
1

最初に、次のようなものを使用して、これらの関数が返す timeval 構造体から秒単位の時間差を取得します。

int diff = a.tv_sec-b.tv_sec;

a と b は、gettimeofday によって返された値です。

次に、それを時間、分、秒の単位に分解します。

int hours=diff/3600;
int minutes=(diff/60)%60;
int seconds=diff%60;

最後に、snprintf 関数を使用して、そのデータを文字列に取得します。

#include <stdio.h>
char output[10];
snprintf(output, 10, "%d:%d:%d", hours, minutes, seconds);

sprintf の単語は printf とまったく同じですが、出力が stdout ではなく文字列になる点が異なります。また、snprintf も同じですが、バッファ オーバーフローを防ぐために n 文字を超えて文字列に書き込まれることはありません。それらをつなぎ合わせれば、仕事は完了です。

于 2012-07-26T19:32:11.733 に答える