C ++ 11实际系统时间,以毫秒为单位

时间:2014-11-25 21:18:56

标签: c++ date c++11 time chrono

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

我花了很多时间试图谷歌,但我发现只有第二精度的例子。

我正在尝试这样的字符串:

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

4 个答案:

答案 0 :(得分:8)

使用this answer中的代码:

#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&#39; VS2015中的实现最终可能会被修复,但到目前为止他们用来支持他们的计时实现的定时器对OS timeBeginPeriod()设置很敏感,显示不同的分辨率,默认设置是我认为16毫秒。

此外,上述代码假定UTC和您的本地时区都没有从std::chrono::system_clock的纪元偏移一小部分秒。


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

答案 1 :(得分:4)

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

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来缩短代码。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

是否有人注意到to_time_t对秒数进行了舍入,而不是截断

auto now = system_clock::now();
time_t secs = system_clock::to_time_t(now);
now {_MyDur={_MyRep=15107091978759765 } }
secs = 1510709198

所以当你坚持毫秒时

auto tse = now.time_since_epoch();
auto now_ms = duration_cast<milliseconds>(tse);
auto now_s = duration_cast<seconds>(tse);
auto jst_ms = now_ms - now_s;
DWORD msecs = jst_ms.count();
msecs = 875

秒应该是1510709197,但是看看now_s,它是对的

now_s {_MyRep=1510709197 }