Question

I used this piece of code to get timestamp in microsecond in c/c++. but it doesn't look like microsecond. also i don't know if there is any way to format it.

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);

and what is the right format to output it? Thank you!

Was it helpful?

Solution 2

The typical printing format for sub-second times uses the decimal indicator (. in many locales) and so 59 and some seconds might look like 59.00013.

The micro variable you created takes the current microsecond count, multiplies it by 1000000 then adds the current microsecond count again; I expect that you intend to either use the microsecond count alone, or together with the count of seconds:

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

should be written as

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

to get seconds and microseconds together in the same number.

To write this into your output, you might consider changing the line

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

to

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

Using the altered micro definition, you can also output

sprintf(currentSeconds, "%.6f", micro / 1000000);

OTHER TIPS

Something a bit shorter to try (C++):

using namespace std::chrono;
__int64 microseconds_since_epoch = duration_cast<microseconds>(system_clock::now().time_since_epoch()).count();

Using Howard Hinnant's free, open-source, header-only date/time library:

#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';
}

which just output for me:

2017-09-29 15:46:27.793195

If you use visual studio (Windows environment),
How about to using 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);

result format : [11:27:00.027]

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top