#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 не имеет никакой переменной-члена в течение миллисекунд.