【问题标题】:c/c++ microsecond timestampc/c++ 微秒时间戳
【发布时间】:2014-04-07 20:08:55
【问题描述】:

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

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

【问题讨论】:

  • unsigned long micro = curTime.tv_usec*(uint64_t)1000000+curTime.tv_usec;这行有什么意义?像unsigned long micro = curTime.tv_sec*(uint64_t)1000000+curTime.tv_usec;这样不是更好吗?
  • 我想我没看懂代码,似乎只需要 unsigned long micro = curTime.tv_usec。
  • 至少在 Linux 上也可以阅读 time(7)

标签: c++ c ctime time.h


【解决方案1】:

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

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

【讨论】:

    【解决方案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);
    

    【讨论】:

    • 谢谢,我太粗心了。试图获得一些快速而肮脏的结果。
    【解决方案3】:

    使用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
    

    【讨论】:

      【解决方案4】:

      如果您使用 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]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-18
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        相关资源
        最近更新 更多