c/c++ отметка времени в микросекундах

Я использовал этот фрагмент кода для получения метки времени в микросекундах в c/c++. но это не похоже на микросекунду. также я не знаю, есть ли способ отформатировать его.

timeval curTime;
gettimeofday(&curTime, NULL);
int milli = curTime.tv_usec / 1000;
unsigned long micro = curTime.tv_usec*(uint64_t)1000000+curTime.tv_usec;

char buffer [80];
//localtime is not thread safe
strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", localtime(&curTime.tv_sec));

char currentTime[84] = "";
char currentTime2[80] = "";
sprintf(currentTime, "%s:%3d", buffer, milli);
sprintf(currentTime2, "%s:%Lu", buffer, micro); 
printf("time %s, hptime %s\n", currentTime, currentTime2);

и какой правильный формат для вывода? Спасибо!


person bbc    schedule 05.03.2014    source источник
comment
Каково значение строки unsigned long micro = curTime.tv_usec*(uint64_t)1000000+curTime.tv_usec;? Не лучше ли было бы unsigned long micro = curTime.tv_sec*(uint64_t)1000000+curTime.tv_usec;?   -  person abiessu    schedule 05.03.2014
comment
Наверное, я не понял код, кажется, нужен только unsigned long micro = curTime.tv_usec.   -  person bbc    schedule 05.03.2014
comment
Прочтите также time(7) хотя бы в Linux   -  person Basile Starynkevitch    schedule 29.09.2017


Ответы (4)


Типичный формат печати для доли секунды использует десятичный индикатор (. во многих регионах), поэтому 59 и некоторые секунды могут выглядеть как 59,00013.

Созданная вами переменная micro принимает текущее количество микросекунд, умножает его на 1000000, а затем снова добавляет текущее количество микросекунд; Я ожидаю, что вы намерены либо использовать подсчет микросекунд отдельно, либо вместе с подсчетом секунд:

unsigned long micro = curTime.tv_usec*(uint64_t)1000000+curTime.tv_usec;

должно быть написано как

unsigned long micro = curTime.tv_sec*(uint64_t)1000000+curTime.tv_usec;

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

Чтобы записать это в свой вывод, вы можете подумать об изменении строки

sprintf(currentTime2, "%s:%Lu", buffer, micro);

to

sprintf(currentTime2, "%s.%Lu", buffer, curTime.tv_usec);

Используя измененное определение micro, вы также можете вывести

sprintf(currentSeconds, "%.6f", micro / 1000000);
person abiessu    schedule 05.03.2014
comment
Спасибо, я был слишком неосторожен. пытался получить какой-то быстрый и грязный результат. - person bbc; 05.03.2014

Что-то немного короче, чтобы попробовать (С++):

using std::chrono;
__int64 microseconds_since_epoch = duration_cast<microseconds>(system_clock::now().time_since_epoch()).count();
person Lorien Brune    schedule 28.09.2017

Используя бесплатную библиотеку дат и времени Говарда Хиннанта с открытым исходным кодом:

#include "date/date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std;
    using namespace std::chrono;
    cout << floor<microseconds>(system_clock::now()) << '\n';
}

который просто выводит для меня:

2017-09-29 15:46:27.793195
person Howard Hinnant    schedule 29.09.2017

Если вы используете Visual Studio (среда Windows),
Как насчет использования WINDOWS API: GetLocalTime()

  char* lptszBuffer = new char[100]; 
  SYSTEMTIME sysTime;
  GetLocalTime( &sysTime );
  sprintf_s(lptszBuffer, 100, "[%02d:%02d:%02d.%03d]", sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds);

формат результата: [11:27:00.027]

person Jake Lee    schedule 13.03.2019