c / c ++微秒时间戳

时间:2014-03-05 16:22:17

标签: c++ c ctime time.h

我使用这段代码在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);

输出它的正确格式是什么?谢谢!

3 个答案:

答案 0 :(得分:2)

亚秒级的典型打印格式使用十进制指示符(在许多区域设置中为.),因此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);

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

使用更改的micro定义,您还可以输出

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

答案 1 :(得分:2)

尝试更短的东西(C ++):

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

答案 2 :(得分:1)

使用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';
}

只为我输出:

2017-09-29 15:46:27.793195