時間計算

解決


HIKARU  2003-08-07 12:55:40  No: 51919  IP: [192.*.*.*]

こんにちは、ヒカルと申します。

あるタイミングにて、現在時刻からの経過時間を表示するには
どう計算できるのでしょうか?

    struct tm   *lptm;
    time_t      timet;
    char        szBuf[256];

    time(&timet);
    lptm = localtime(&timet);

    wsprintf(szBuf, "%02d:%02d:%02d", lptm->tm_hour, lptm->tm_min, lptm->tm_sec);

構造体の時分秒をそれぞれ引き算するのでしょうか?

編集 削除
difftime  2003-08-07 13:18:59  No: 51920  IP: [192.*.*.*]

ヘルプ見。difftime

編集 削除
fuku  2003-08-07 13:39:01  No: 51921  IP: [192.*.*.*]

経過時間が欲しいのなら、
計測を開始したいタイミングで
   time_t starttime;
   starttime=time(NULL);
等としてstarttimeに現在の時間を取得しておき、
経過時間を求める時に
   time_t buf;
   buf=time(NULL);
   printf("%d秒経過しました",(int)(buf-starttime));
等とすれば容易に秒単位の経過時間を取得できます。
#秒単位で計測されるのはローカルもグローバルも同じなので。
注意点はstarttimeが消滅しないようにすることと、
starttimeからbufを取得するまでの間にシステムクロックを変更されると正しい結果にならなくなることです。

>構造体の時分秒をそれぞれ引き算するのでしょうか?
それでもできるんですが、いろいろ面倒です。

編集 削除
HIKARU  2003-08-07 15:31:49  No: 51922  IP: [192.*.*.*]

それだと、形式が秒単位になってしまうんですね、
00:00:00秒のようにウインドウへ描画したいのですが、
このフォーマットをとるにはどうすれば良いでしょうか?

例えば、300秒なら300/60 = 5
00:05:00のように別途計算が必要でしょうか?

ただ、3600秒を超えたらまた単位が違うので
これを汎用的な計算をさせるにはどうしたら良いでしょうか?

編集 削除
HIKARU  2003-08-07 17:01:56  No: 51923  IP: [192.*.*.*]

VBだとこんな事もできるのですが。

TimeSerial(Int(秒数 / 3600),
          Int((秒数 Mod 3600) / 60),
          秒数 Mod 3600 Mod 60)

VCでも同じような感じでしょうか。

編集 削除
fuku  2003-08-07 17:22:59  No: 51924  IP: [192.*.*.*]

>例えば、300秒なら300/60 = 5
>00:05:00のように別途計算が必要でしょうか?
別途計算するほうが作るのは楽です。
割り算が増えるのは難点ですが。

>ただ、3600秒を超えたらまた単位が違うので
>これを汎用的な計算をさせるにはどうしたら良いでしょうか?
こんなんでいかがでしょうか?
   time_t starttime;//開始時刻が入っている
   time_t buf;
   int buf2,buf3;
   buf=time(NULL);
   buf2=buf-starttime;
   buf3=buf2%3600;
   printf("%02d:%02d:%02d",buf2/3600,buf3/60,buf3%60);
ちなみに、時、分を区切る:はウィンドウ表示時全角文字の方が見やすいです。

編集 削除
HIKARU  2003-08-07 17:31:05  No: 51925  IP: [192.*.*.*]

なるほどっ、int型での演算は小数点以下切捨て
になってくれるんですね、
Int関数(切捨)はどうすればいいのかと考えていました。

ありがとうございます、これでできそうです^^

編集 削除
HIKARU  2003-08-07 17:32:01  No: 51926  IP: [192.*.*.*]

申し訳ありません、チェックマークを入れ忘れてしまいました。

編集 削除
fuku  2003-08-07 17:33:28  No: 51927  IP: [192.*.*.*]

>TimeSerial(Int(秒数 / 3600),
>          Int((秒数 Mod 3600) / 60),
>          秒数 Mod 3600 Mod 60)
>
>VCでも同じような感じでしょうか。
Modって剰余算ですよね?
#CやC++では剰余演算子は%です。
だとすれば、やってる事は同じです。
先程の例では同じ計算を何度もするのを省くため、バッファ変数をいくつか使っています。
1行で書いたらこんな感じです。
   printf("%02d:%02d:%02d",(int)秒数/3600,(int)秒数%3600/60,(int)秒数%60);

編集 削除