вычисление миллисекунд с середины ночи

#c #c #unix #unix-timestamp

#c #c #unix #unix-временная метка

Вопрос:

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

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

 gettimeofday(amp;tv, amp;tz);
 tma=localtime(amp;tv.tv_sec);
 static char* months[] = {"JAN", "FEB", "MAR", "APR", "MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"};
 sprintf(buff,"d %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", amp;tm1);
 tm1.tm_isdst = -1;
 t = mktime(amp;tm1);
 time ( amp;rawtime );

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

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

Комментарии:

1. Когда вы говорите о различиях, какую проблему вы видите?

2. иногда его миллисекунда меньше, чем ожидалось

Ответ №1:

Вам нужно правильно вычислить в качестве 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( amp;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 текущего времени равными нулю.

Вы знаете, что делать после того, как найдете time_t полуночи.

Комментарии:

1. я ищу миллисекунды не в секундах.

2. @CrazyC — Вау, это сложно! Вы, конечно, знаете, как поставить задачу. Мне нужно будет подумать об этом. О, да! Теперь я помню: миллисекунды = секунды * 1000. Фух! больше не задавайте эти умопомрачительные вопросы — все эти размышления заставляют мою голову взрываться 🙂

3. Я смотрю время в миллисекундах точно. Если я переведу секунды в миллисекунды, то потеряю миллисекунды. Давайте предположим, что в тот момент, когда я показываю время, оно составляет 2:30: 07: 499 (h: mm: ss: миллисекунда), в соответствии с предлагаемым решением я потеряю 499 миллисекунд. Надеюсь, вы поняли, в чем дело 🙂

4. О, я понимаю, спасибо. Это учитывается при вычислении time_t для полуночи. Полночь — это час0, минут0, секунд0, миллисекунд0 равно 0:0: 0:0, правильно? Другими словами, когда вы формируете time_t полуночи, вас интересует только начало дня; час, минута, секунда и миллисекунда не являются частью вычисления — они отбрасываются, устанавливаются на ноль — так что вы ничего не теряете.

5. Не могли бы вы, пожалуйста, опубликовать код? struct tm не имеет никакой переменной-члена в течение миллисекунд.