首页 > 解决方案 > 如何用微秒创建时间戳

问题描述

我正在尝试生成分辨率为微秒的时间戳。我尝试使用这个答案 从 C++ 中的 std::chrono::time_point 中提取年/月/日等,还有这个:C++11 毫秒的实际系统时间, 但我不确定这样做是否正确:

template <typename Duration>
void print_time(tm t, Duration fraction) {
using namespace std::chrono;
std::printf("[%04u-%02u-%02u %02u:%02u:%02u.%03u.%03u]\n", t.tm_year + 1900,
        t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,
        static_cast<unsigned>(fraction / milliseconds(1)),
        static_cast<unsigned>(fraction / microseconds(1)));
}

int main() {
using namespace std;
using namespace std::chrono;
system_clock::time_point now = system_clock::now();
system_clock::duration tp = now.time_since_epoch();
tp -= duration_cast<seconds>(tp);
time_t tt = system_clock::to_time_t(now);
cout << tp.count() <<endl;
print_time(*gmtime(&tt), tp);
print_time(*localtime(&tt), tp);

这段代码的输出是:

324760155 [2019-09-15 10:09:13.324.324760] [2019-09-15 10:09:13.324.324760]

标签: c++chrono

解决方案


template <typename Rep, typename Period>
void
print_time(tm t, std::chrono::duration<Rep, Period> fraction)
{
    using namespace std::chrono;
    auto ms = duration_cast<milliseconds>(fraction);
    fraction -= ms;
    auto us = duration_cast<microseconds>(fraction);
    std::printf("[%04u-%02u-%02u %02u:%02u:%02u.%03u.%03u]\n", t.tm_year + 1900,
        t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,
        static_cast<unsigned>(ms / milliseconds(1)),
        static_cast<unsigned>(us / microseconds(1)));
}
  • 我对您的参数所做的更改使其不会过于通用并接受不是chrono::duration.

  • 要得到millisecondsout 的数量fraction(并且假设fraction是非负数),只需duration_cast<milliseconds>(fraction).

  • 现在你需要从 中减去milliseconds上一步获得的值fraction,以免它们在下一步中回来困扰你。

  • 要得到microsecondsout 的数量fraction(并且假设fraction是非负数),只需duration_cast<microseconds>(fraction).

如果您想更进一步并从 中nanoseconds取出fraction,则需要先减去该microseconds部分,然后再继续。


推荐阅读