如何在 C 11 中以毫秒为单位打印当前系统时间?

新手上路,请多包涵

我在以毫秒为单位获取实际系统时间时遇到问题。我发现的唯一一种好方法是 Windows.h ,但我不能使用它。我应该使用 std::chrono 。我怎样才能做到这一点?

我花了很多时间试图用谷歌搜索它,但我只找到了第二精度的例子。

我试图得到这样的字符串:

 [2014-11-25 22:15:38:449]

原文由 ziggy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 699
2 个回答

使用 此答案 中的代码:

 #include <chrono>
#include <ctime>
#include <iostream>

template <typename Duration>
void print_time(tm t, Duration fraction) {
    using namespace std::chrono;
    std::printf("[%04u-%02u-%02u %02u:%02u:%02u.%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)));

    // VS2013's library has a bug which may require you to replace
    // "fraction / milliseconds(1)" with
    // "duration_cast<milliseconds>(fraction).count()"
}

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

    print_time(*gmtime(&tt), tp);
    print_time(*localtime(&tt), tp);
}

要记住的一件事是,计时器返回亚毫秒面额的值这一事实并不一定表明计时器具有亚毫秒分辨率。我认为 Windows 在 VS2015 中的实现可能最终会得到修复,但是到目前为止他们用来支持他们的 chrono 实现的计时器对操作系统 timeBeginPeriod() 设置很敏感,显示不同的分辨率和默认设置我认为是 16 毫秒。

上面的代码还假设 UTC 和您的本地时区都没有从 std::chrono::system_clock 的纪元偏移一个小数秒值。


使用霍华德的日期函数来避免 ctime 的示例:http: //coliru.stacked-crooked.com/a/98db840b238d3ce7

原文由 bames53 发布,翻译遵循 CC BY-SA 3.0 许可协议

std::chrono 为您提供表示时间点或两个时间点之间经过的持续时间的实用程序。它允许您获取有关这些时间间隔的信息。

提供任何 日历 信息。不幸的是,目前 C++ 标准中没有这些工具。 boost::date_time 在这里可能会有所帮助。

原文由 Jay Miller 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题