こんにちは、ヒカルと申します。
あるタイミングにて、現在時刻からの経過時間を表示するには
どう計算できるのでしょうか?
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
編集 削除経過時間が欲しいのなら、
計測を開始したいタイミングで
time_t starttime;
starttime=time(NULL);
等としてstarttimeに現在の時間を取得しておき、
経過時間を求める時に
time_t buf;
buf=time(NULL);
printf("%d秒経過しました",(int)(buf-starttime));
等とすれば容易に秒単位の経過時間を取得できます。
#秒単位で計測されるのはローカルもグローバルも同じなので。
注意点はstarttimeが消滅しないようにすることと、
starttimeからbufを取得するまでの間にシステムクロックを変更されると正しい結果にならなくなることです。
>構造体の時分秒をそれぞれ引き算するのでしょうか?
それでもできるんですが、いろいろ面倒です。
それだと、形式が秒単位になってしまうんですね、
00:00:00秒のようにウインドウへ描画したいのですが、
このフォーマットをとるにはどうすれば良いでしょうか?
例えば、300秒なら300/60 = 5
00:05:00のように別途計算が必要でしょうか?
ただ、3600秒を超えたらまた単位が違うので
これを汎用的な計算をさせるにはどうしたら良いでしょうか?
VBだとこんな事もできるのですが。
TimeSerial(Int(秒数 / 3600),
Int((秒数 Mod 3600) / 60),
秒数 Mod 3600 Mod 60)
VCでも同じような感じでしょうか。
>例えば、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);
ちなみに、時、分を区切る:はウィンドウ表示時全角文字の方が見やすいです。
なるほどっ、int型での演算は小数点以下切捨て
になってくれるんですね、
Int関数(切捨)はどうすればいいのかと考えていました。
ありがとうございます、これでできそうです^^
申し訳ありません、チェックマークを入れ忘れてしまいました。
編集 削除>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);