首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++11中以毫秒打印当前系统时间?

如何在C++11中以毫秒打印当前系统时间?
EN

Stack Overflow用户
提问于 2014-11-25 21:18:56
回答 4查看 20.4K关注 0票数 10

我在获得毫秒的实际系统时间方面遇到了问题。我发现的唯一好方法是在Windows.h中,但我不能使用它。我应该用std::chrono。我该怎么做?

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

我想要得到这样的绳子:

代码语言:javascript
复制
[2014-11-25 22:15:38:449]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-25 21:54:51

使用来自this answer的代码

代码语言:javascript
复制
#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中的实现可能最终是固定的,但是到目前为止,他们用来支持时间实现的计时器对OS timeBeginPeriod()设置非常敏感,显示不同的分辨率,默认设置是16毫秒。

另外,上面的代码假设UTC和您的本地时区都不会被分数秒值与std::chrono::system_clock的时代相抵消。

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

票数 14
EN

Stack Overflow用户

发布于 2014-11-25 22:21:28

这个答案仍然使用一些C API,但只在函数中使用,所以您可以忘记它:

代码语言:javascript
复制
template<typename T>
void print_time(std::chrono::time_point<T> time) {
    using namespace std;
    using namespace std::chrono;

    time_t curr_time = T::to_time_t(time);
    char sRep[100];
    strftime(sRep,sizeof(sRep),"%Y-%m-%d %H:%M:%S",localtime(&curr_time));

    typename T::duration since_epoch = time.time_since_epoch();
    seconds s = duration_cast<seconds>(since_epoch);
    since_epoch -= s;
    milliseconds milli = duration_cast<milliseconds>(since_epoch);

    cout << '[' << sRep << ":" << milli.count() << "]\n";
}

这仅仅是对bames53代码的重写,但使用strftime将代码缩短了一点。

票数 4
EN

Stack Overflow用户

发布于 2014-11-25 21:48:02

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27136854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档