2011-10-23 10 views
0

私は深夜からミリ秒を計算する必要がありますが、コードを書いても問題はないようです。深夜からミリ秒を計算

time_t t; 
time_t rawtime; 
char buff[256] ={0}; 
struct timeval tv; 
struct timezone tz; 
struct tm *tma; 

gettimeofday(&tv, &tz); 
tma=localtime(&tv.tv_sec); 
static char* months[] = {"JAN", "FEB", "MAR", "APR", "MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"}; 
sprintf(buff,"%02d %s %d 00:00:00",tma->tm_mday, months[tma->tm_mon], tma->tm_year + 1900); 

struct tm tm1; 
strptime(buff, "%d %b %Y %H:%M:%S", &tm1); 
tm1.tm_isdst = -1; 
t = mktime(&tm1); 
time (&rawtime); 

time_t milSecFromMidNight = (rawtime - t)*1000 + tv.tv_usec/1000; 

ミリ秒で違いがあるようです。誰でもそれを指摘できますか?

+3

違いを言うとき、あなたはどんな問題を見ていますか? – marnir

+0

ミリ秒が予想よりも遅い – CrazyC

答えて

2

time_tとして、最後の前の深夜(つまり、現在の日が始まった深夜)を正しく計算する必要があります。

// function to calculate midnite last night 

time_t // calc current day 00:00:00 
today_at_0000 () { 
    time_t curtime, midtime; 
    struct tm *localtm_p; 
    curtime = time(NULL); 
    localtm_p = localtime(&curtime); 
    localtm_p->tm_hour = 0; 
    localtm_p->tm_min = 0; 
    localtm_p->tm_sec = 0; 
    midtime = mktime(localtm_p); // today at 00:00:00 
    return midtime; 
} 

重要なポイントは、あなたがtm_hour、tm_minを設定した後、真夜中を見つけるにはmktime()を使用する必要があり、かつゼロに現在の時間のtm_sec:あなたはこのようにそれに何かを行うことができます。

あなたは真夜中のtime_tを見つけた後に何をすべきかを知っています。

+0

ミリ秒が秒単位で表示されています。 – CrazyC

+0

@CrazyC - うわー、それは厳しいものです!あなたは確かに挑戦をする方法を知っています。私はそれについて考える必要があります。そうそう!今私は覚えています:ミリ秒=秒* 1000。これらの心を曲げる質問をこれ以上聞かないでください - 思考が私の頭を爆発させます:-) –

+0

私は正確にミリ秒で時間を探しています。秒をミリ秒に変換すると、ミリ秒単位で損失が発生します。私は時間が2:30:07:499(h:mm:ss:ミリ秒)であると仮定すると、提案された解決法によれば、私は499ミリ秒失うでしょう。あなたがポイントを持っていることを願って:) – CrazyC