如何从纪元到午夜获得UTC秒

时间:2015-11-13 10:46:11

标签: c++

我必须实例化一个自定义库类的对象,该类需要nanoseconds since 'epoch' in UTC time来构造:

class utc_time
{
public:
utc_time(TYPE nanoseconds_since_epoch):
_nanoseconds_since_epoch(nanoseconds_since_epoch){}

private:
TYPE _nanoseconds_since_epoch;
};

我的输入是nanoseconds since 'midnight' in UTC time。当然,我需要获得epoch直到最后midnight纳秒(以UTC为单位)才能将其添加到我的输入并将其提供给我的类构造函数。 我知道我们有gtime可能会有所帮助,但我不知道如何提取所需的信息。

我很感激你的线索

2 个答案:

答案 0 :(得分:8)

在C ++ 11及更高版本中,<chrono>可以很容易地用来做到这一点:

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    using namespace std;
    using days = duration<int, ratio<86400>>;
    nanoseconds last_midnight =
        time_point_cast<days>(system_clock::now()).time_since_epoch();
    cout << last_midnight.count() << '\n';
}

答案 1 :(得分:2)

事实上,自Epoch以来的纳秒数=自午夜以来的纳秒数+ 1e9 *最后午夜的日历时间。你缺乏后一个价值。您可以使用::gmtime()::mktime()

的组合构建它
#include <ctime>

std::time_t last_midnight()
{
    // compute "now"
    std::tm& tm = *::gmtime(NULL);
    // move it to "last midnight"
    tm.tm_hour = 0;
    tm.tm_min  = 0;
    tm.tm_sec  = 0;
    // get time_t back
    return ::mktime(&tm);
}

您可能会对使用::gmtime_r()(可重入版本)而不是::gmtime()感兴趣。