2009-07-13 3 views
11

Следующий фрагмент кода используется для печати времени в журналах:Захватив время в миллисекундах

#define PRINTTIME() struct tm * tmptime; 
time_t  tmpGetTime; 
time(&tmpGetTime); 
tmptime = localtime(&tmpGetTime); 
cout << tmptime->tm_mday << "/" <<tmptime->tm_mon+1 << "/" << 1900+tmptime->tm_year << " " << tmptime->tm_hour << ":" << tmptime->tm_min << ":" << tmptime->tm_sec<<">>"; 

Есть ли способ, чтобы добавить миллисекунды к этому?

+4

возможно дубликат [Как получить текущую ти mestamp в миллисекундах с 1970 года именно так, как Java получает] (http://stackoverflow.com/questions/19555121/how-to-get-current-timestamp-in-milliseconds-since-1970-just-the-way-java- получает) –

ответ

17

Чтобы иметь миллисекундную точность, вам необходимо использовать системные вызовы, характерные для вашей ОС.

В Linux вы можете использовать

#include <sys/time.h> 

timeval tv; 
gettimeofday(&tv, 0); 
// then convert struct tv to your needed ms precision 

timeval имеет точность микросекунд.

В Windows вы можете использовать:

#include <Windows.h> 

SYSTEMTIME st; 
GetSystemTime(&st); 
// then convert st to your precision needs 

Конечно, вы можете использовать Boost, чтобы сделать это для вас :)

+0

Спасибо большое, я попробую это – ronan

+0

Для Linux вы должны * читать [время (7)] (http://man7.org/linux/man-pages/man7/time.7.html) и, вероятно, используйте [clock_gettime (2)] (http://man7.org/linux/man-pages/man2/clock_gettime .2.html) –

+0

Возможно, вы могли бы предоставить заголовки для функций? – spectre

4

Вам нужен таймер с более высоким разрешением для захвата миллисекунд. Попробуйте следующее:

int cloc = clock(); 
//do something that takes a few milliseconds 
cout << (clock() - cloc) << endl; 

Это, конечно, зависит от вашей ОС.

+0

Hum Я думаю, что clock() возвращает clock_t, который представляет собой блок часов. Более того, на linux он не достигает точности мс AFAIK – neuro

+0

@neuro в моей программе Linux. Я получаю двойные значения для clock() – user3085931

2

Таймеры высокого разрешения, как правило, gettimeofday на платформах стиля Linux и QueryPerformanceCounter в Windows.

Вы должны знать, что синхронизация продолжительности одной операции (даже с таймером с высоким разрешением) не даст точных результатов. В игре слишком много случайных факторов. Чтобы получить надежную информацию о времени, вы должны запустить задачу, которая должна быть синхронизирована в цикле, и вычислить среднее время задачи. Для этого типа синхронизации функция clock() должна быть достаточной.

2

Если вы не хотите использовать любой OS-зависимый код, вы можете используйте пакет ACE, который поставляет функцию ACE_OS::gettimeofday для большинства стандартных операционных систем. Например:

ACE_Time_Value startTime = ACE_OS::gettimeofday(); 

do_something(); 

ACE_Time_Value endTime = ACE_OS::gettimeofday(); 

cout << "Elapsed time: " << (endTime.sec() - startTime.sec()) << " seconds and " << double(endTime.usec() - startTime.usec())/1000 << " milliseconds." << endl; 

Этот код будет работать независимо от операционной системы (до тех пор, как ACE поддерживает эту ОС).

14

// C++ 11 Стиль:

cout << "Time in Milliseconds =" << 
chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now().time_since_epoch()).count() 
<< std::endl; 

cout << "Time in MicroSeconds=" << 
chrono::duration_cast<chrono::microseconds>(chrono::steady_clock::now().time_since_epoch()).count() 
<< std::endl; 
1

В Ubuntu 16.04 это работало для меня ...

const std::string currentDateTime() { 
    char   fmt[64], buf[64]; 
    struct timeval tv; 
    struct tm  *tm; 

    gettimeofday(&tv, NULL); 
    tm = localtime(&tv.tv_sec); 
    strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u", tm); 
    snprintf(buf, sizeof buf, fmt, tv.tv_usec); 
    return buf; 
} 

Затем, с ...

std::cout << currentDateTime(); 

Я получаю ...

2016-12-29 11:09:55.331008 
1

Новый ответ на старый вопрос с помощью C++ 11 или C++ 14 и это free, open-source library:

#include "tz.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    using namespace std; 
    using namespace std::chrono; 
    auto now = make_zoned(current_zone(), floor<milliseconds>(system_clock::now())); 
    cout << format("%e/%m/%Y %T", now) << '\n'; 
} 

Это просто выход для меня:

16/01/2017 15:34:32.167 

который мой текущий локальная дата и время до миллисекундной точности. Исключив floor<milliseconds>(), вы автоматически получите любую точность, которую имеет ваш system_clock.

Если вы хотите результата в виде UTC метки времени вместо локальной временной метки, еще проще:

auto now = floor<milliseconds>(system_clock::now()); 
    cout << format("%e/%m/%Y %T", now) << '\n'; 

И если вы хотите UTC метки времени, и вы не требовательны к точности или формат , вы можете просто:

cout << system_clock::now() << '\n'; 

который только выход для меня:

2017-01-16 20:42:11.267245 
Смежные вопросы