如何使用微秒创建时间戳

3

我正在尝试生成一个微秒级别的时间戳。 我尝试使用这个答案(从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年9月15日 10:09:13.324.324760] [2019年9月15日 10:09:13.324.324760]
2个回答

3
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类型。
要从fraction中获取毫秒数(并假设fraction为非负),只需使用duration_cast<milliseconds>(fraction)
现在,您需要从前一步骤获得的milliseconds中减去fraction以避免在下一步骤中出现问题。
要从fraction中获取微秒数(并假设fraction为非负),只需使用duration_cast<microseconds>(fraction)
如果您想进一步获取fraction中的nanoseconds,则需要先减去microseconds部分。

0
你在这行代码上失去了精度:
tp -= duration_cast<seconds>(tp);
一次性获取微秒级别的数据,最好是纳秒级别的,然后再按所需格式重新读取它们。

现在我得到了 [2019-09-15 10:46:00.881297578.829282533] 这些数字的挖掘是什么? - yaodav
从1970年1月1日到当前时刻的纳秒数,即UNIX时间。但分为毫秒(第一个数字)和微秒(第二个数字)。问题是,你认为最后几个数字应该是什么?因为如果我们需要像Unix时间一样的秒/毫秒/微秒/纳秒时间戳,那么可以使用标准函数将其转换为可读时间。在printf末尾写什么是多余的,只需以正确的格式获取tp即可。 - Silerus
我的主要目标是通过比较时间戳来测量和基准测试我的程序,因此我希望时间戳的格式为HH:MM:SS:ML:US。 - yaodav
1
我们将采用另一种方式:<br>std::chrono::time_point<std::chrono::system_clock> start, end; std::chrono::system_clock::duration elapsed; start = std::chrono::system_clock::now(); /*主程序循环*/ elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end-start); //现在我们有了花费的微秒数<br>根据微秒数命名,我们可以将它们除以每小时的微秒数,得到小时数/每分钟 - 得到分钟数/每秒。您只需要记住减去已经得到的结果即可。 - Silerus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接