рассчитать миллисекунды с середины ночи - PullRequest
0 голосов
/ 23 октября 2011

Мне нужно посчитать миллисекунды с середины ночи, написали код, но, похоже, что есть какая-то проблема.

 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;

Кажется, некоторое время в миллисекундах есть различия.Кто-нибудь может указать на это?

1 Ответ

2 голосов
/ 23 октября 2011

Вам необходимо правильно рассчитать, как 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;
}

Важным моментом является то, что вы должны использовать mktime (), чтобы найти полночь после установки нулевых значений tm_hour, tm_min и tm_sec текущего времени.

Ты знаешь, что делать после того, как найдешь время полуночи.

...