c/c++ microsecond timestamp

妖精的绣舞 提交于 2019-12-08 07:52:37

问题


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!


回答1:


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



回答2:


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

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



回答3:


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



回答4:


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]



来源:https://stackoverflow.com/questions/22203319/c-c-microsecond-timestamp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!